package com.t_06;

import org.junit.Test;

import com.t_06.StaticClass.StaticInnerClass;

/**
* 一个类的定义放在另一个类的内部,这个类就叫内部类
* @author Administrator
*
*/
public class First { public class Contents{//像这样的,Contents就叫做内部类,内部类了解外部类,并能与之通信
public void f(){
System.out.println("In Class First's inner Class Contents method f()");
}
}
@Test
public void fun(){
Second second=new Second();
second.setStr("鸟");
Second.Contents contents=second.new Contents();//创建内部类对象使用的是外围类对象.new内部类对象的方式
contents.f();
}
/**
* 此时,内部类是private的,可以它的外围类Painter以外,没人能访问
* 这样private内部类给类的设计者提供了一种途径,通过这种途径可以完全阻止任何依赖类型的编码,并完全隐藏实现的细节
*/
@Test
public void fun2(){
Painter painter=new Painter();
Shape shape=painter.getShape();
shape.paint();
} /**
* 方法内部的类
* 可以在方法内创建一个类
* 值得注意的是:方法内部创建的类,不能加访问修饰符
* 另外方法内部的类也不是在调用方法时才创建的,它们一样被编译了
*/
public void test1(){
class Inner{
public void method(){
System.out.println("在方法内部创建的类");
}
}
} @Test
public void fun3(){
Painter painter=new Painter();
Shape shape=painter.getShape1();
shape.paint();
} /**
* 在implemention1和2中匿名内部类用在字段初始化的地方,这样定义的工厂方法是不是看起来更舒适些?
* 没感觉!
*/
@Test
public void fun4(){
service(implemention1.factory);
service(implemention2.factory); ServiceFactory factory1=implemention1.factory;
Service service1=factory1.getService();
service1.method1(); ServiceFactory factory2=implemention2.factory;
Service service2=factory2.getService();
service2.method1();
} public void service(ServiceFactory factory){
Service service = factory.getService();
service.method1();
}
@Test
public void fun5(){
StaticClass.StaticInnerClass inner=new StaticClass.StaticInnerClass();
System.out.println(inner.getNum());
} } class Second{
/**
* 创建了内部类对象时,他会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需要任何特殊条件。
*/
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public class Contents{
public void f(){
System.out.println("First.str="+str);
}
}
} /**
* 内部类与向上转型
* @author Administrator
*
*/
interface Shape{
public void paint();
}
class Painter{
private class InnerShape implements Shape{ public void paint() {
System.out.println("painter paint() method");
} }
public Shape getShape(){
return new InnerShape();
} /**
* 匿名内部类,注意后面要有一个分号,如果匿名内部类中需要使用一个参数,那么该参数一定是final类型的
* 匿名内部类里面没有构造器,如果想要模仿构造器效果,可以采用代码块{}
*
*/
public Shape getShape1(){
return new Shape(){ public void paint() {
System.out.println("painter paint() method");
}
{
System.out.println("init method!");
} };
}
}
/**
* 通过匿名内部类改造工厂方法
*
*/
interface Service{
public void method1();
}
interface ServiceFactory{
Service getService();
}
class implemention1 implements Service{ public void method1() {
System.out.println("In Implemention1 method method1()");
} public static ServiceFactory factory=new ServiceFactory(){ public Service getService() {
return new implemention1();
} }; }
class implemention2 implements Service{ public void method1() {
System.out.println("In Implemention2 method method1()");
} public static ServiceFactory factory=new ServiceFactory(){ public Service getService() {
return new implemention2();
} }; } /**
* 嵌套类
* static的内部类就叫嵌套类
* 嵌套类是一个例外,使用嵌套类的时候注意:
* 嵌套类直接通过new来创建
* 在嵌套类中,不能像普通内部类一样访问外部类的非static成员
* 嵌套类中可以有static方法,不同内部类中不允许有这个。
*/ class StaticClass{
private int num;
private static int sum=;
public static class StaticInnerClass{
public int getNum(){
return sum;
}
}
} /**
* 为什么要内部类
* a、内部类提供了某种进入外围类的窗户。
* b、每个内部类都能独立继承一个类,无论父类是否已经继承了某个类
*/

Java内部类复习的更多相关文章

  1. java 内部类复习

    /** * 内部类详解 * * @author shao * */ public class InnerClass { public static void main(String[] args) { ...

  2. java基础复习记录

    java基础复习记录(数组.对象.异常) 数组 数组的定义 数组是相同类型数据的有序集合.如:篮球队就是一个数组,队员球服上有号码,相当于索引.通过某一个的某一个号码来确认是某一个队员.数组中索引从0 ...

  3. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  4. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  5. 黑马----JAVA内部类

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...

  6. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  7. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  8. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  9. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

随机推荐

  1. Centos7 安装 Maven 3.5.*

    下载 Apache Maven 访问 Maven官方网站,打开后找到下载链接,如下: 解压 tar zxvf apache-maven-3.5.3-bin.tar.gz 添加环境变量 打开 /etc/ ...

  2. 基于jenkins,tekton等工具打造kubernetes devops平台

    本贴为目录贴,将不断更新 目录 1.Docker在centos下安装以及常见错误解决 2.使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像) 3.无法访问gcr ...

  3. Jquery 常用方法总结

    1.Attribute(属性): $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式 $(”img”).attr({src:”test.jpg”,alt:”test Ima ...

  4. selenium3 踩坑--move_to_element()报错

    问题:selenium3 使用move_to_element()报错,报错信息如下图所示: 网上没有找到合适的解决办法,回退到稳定的selenium2可以解决. pip install seleniu ...

  5. 【WPF学习笔记】[转]周银辉之WPF中的动画 && 晓风影天之wpf动画——new PropertyPath属性链

    (一)WPF中的动画 动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互.这里我们讨论一下故事板. 在WPF中我们采用Storyboard(故事板)的方式 ...

  6. 11 linux nginx上安装ecshop 案例

    一: nginx上安装ecshop 案例 (1)解压到 nginx/html下 浏览器访问:127.0.0.1/ecshop/index.php 出现错误:not funod file 原因:ngin ...

  7. System.DateTime.Now.ToString()的一些用法

    日期处理函数    //2007年4月24日    this.TextBox6.Text = System.DateTime.Now.ToString("D");    //200 ...

  8. iOS上使用自定义ttf字体

    本文转载至 http://blog.csdn.net/allison162004/article/details/38777777 项目中想使用第三方的字体,在stackoverflow上查询解决办法 ...

  9. EasyPlayerPro Windows播放器全屏模式下GDI显示出现黑屏问题解决

    问题来源 2017.12.21 前天有杭州某教育领域客户反馈有部分视频源在全屏模式下显示黑屏: 问题复现 EasyPlayerPro由于没有实现单个窗口完全全屏,故没有暴露该问题,晚上加班,加上单个窗 ...

  10. apache 301重定向到带www的二级域名

    Options +FollowSymlinks RewriteEngine on rewritecond %{http_host} ^nlike.cn [nc] rewriterule ^(.*)$ ...