时间:2018-07-15
内部类 innerclasses
将一个类的的定义放在另一个类的定义内部,这就是内部类
每个内部类都能独立的继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响
内部类提供了更好的封装,只能让外部类直接访问,不允许同一个包中其他类的访问。
内部类是一个独立的实体
内部类可以访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性。
----当我们创建一个内部类的时候,它无形与外围类有一个联系,依靠这种联系,它可以无限制的访问外部类的元素
----这是因为,当我们创建某个外部类的内部类对象时,此时内部类对象必定会捕捉一个指向那个外部类对象的引用,只要我们在访问外部类成员的时候,就会用这个引用来选择外部类成员
引用内部类的时候,我们需要指明这个对象的类型 OuterClass.InnerClass,同时如果我们需要创建某个内部类对象,必须通过外部类对象.new 来创建内部类:OuterClass.InnerClass var = new OuterClass().new InnerClass();
如果我们需要生成对外部类对象的引用,可以使用OuterClass.this
public class OuterClass {
private String name;
private int age;
public void show(){
System.out.println("OuterClass : name = "+name+"age = "+age );
}
public class InnerClass{
public void show(){
System.out.println("InnerClass :name = "+name+"age = "+age );
}
public OuterClass getOuterClass(){
return OuterClass.this;
}
}
public static void main(String[] args) {
//OuterClass.InnerClass inner = new OuterClass().new InnerClass();
//或者...............
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
//.....................
inner.show();
inner.getOuterClass().show();
}
}
InnerClass :name = nullage = 0
OuterClass : name = nullage = 0
内部类是一个编译时的概念,一旦编译成功后,它就与外部类属于两个完全不同的类,上例中,编译成功后,会出现两个class文件,OuterClass .class 与OuterClass$InnerClass .class
通常,内部类只为所在外部类提供服务的情况下优先使用。
内部类的分类:
----1.成员内部类(可以使用private,protected,public 任意修饰)
----成员内部类也是一个最普通的内部类,它是外部类的一个成员,所以它可以无限制的访问外部类所有的成员属性和方法,但是外部类要访问内部类的成员属性和方法则需要通过内部类的实例来访问。
----成员内部类需要注意两点:成员内部类不能存在任何static变量和方法;成员内部类是依附外部类的,所以只有先创建外部类才能创建内部类
----非静态内部类(外部类里使用非静态内部类和平时使用其他类没有什么不同)
----非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象,那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象
----非静态内部类可以使用外部类的成员,但外部类不能直接访问非静态内部类成员
----非静态内部类不能有静态方法,静态属性,静态初始化块。
----静态成员不能访问非静态成员:外部类的静态方法,静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例。
----成员变量访问要点:
----内部类里方法的局部变量:变量名。
----内部类属性:this. 变量名
----外部类属性:外部类类名.this.变量名
----内部类访问:
----外部类中定义内部类:new innerClass()
----外部类以外的地方使用非静态内部类:Outer.inner var = OuterObject.new inner()
----静态内部类:
----当一个静态内部类对象存在时,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能访问外部类的实例方法
----不能使用任何外围类的非static成员变量和方法。
----静态内部类看做外部类的一个静态成员。因此,外部类的方法可以通过:静态内部类.名字 访问静态内部类的静态成员。通过new 静态内部类()访问静态内部类的实例。
----在外部类的外面创建静态内部类;outerclass.innerclass var = new outerclass.innerclass()
----局部内部类
----嵌套在方法和作用域内
----匿名内部类
----匿名内部类是没有访问修饰符的
----new 匿名内部类,这个类首先是要存在的
----当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final
----匿名内部类是没有构造方法的