所谓内部类就是在一个类内部定义的类,内部类分为实例内部类和静态内部类。
通常说一个类是由属性、方法和构造函数组成的,内部类也是类的一个组成单位,同属性、方法没有任何不同。
外部类的私有属性可以被本类的方法使用,当然肯定也能够被本类的内部类使用,因为内部类也是类的一个组成单位,始终还是在这个类的内部啊。这里有一点需要注意的是,如果内部类和外部类的属性名相同,内部类中没有显示指出使用的是外部类的属性的话,默认使用的是内部类的属性。这跟方法中的局部变量和类中的全局变量冲突是一个道理,山高皇帝远,土鳖称霸王嘛。局部变量和全局变量冲突会怎么办?
普通类用 private 修饰没有什么意义,但是内部类用 private 修饰还是很有实际用处的,比如java.util.LinkedList
内部就封装了内部类,用来实现迭代器的功能。内部类还可以用 protected 修饰!内部类可以用四种访问权限的任意一种来修饰。
实例内部类
实例内部类意思就是这个内部类是依赖于对象而存在的,一个外部类的对象,可以对应多个内部类对象。内部类会默认拥有一个指向其所依赖的外部类对象的属性,通过外部类名.this 来使用。
外部类的实例方法中可以来创建其内部类的对象,但是静态方法内部肯定是不能够的,因为静态方法不能够接收 this 指针。
class Outer{
int size = 2;
int age = 18;
class Inner{
int size = 3;
public void f() {
System.out.println(this.size);//输出3
System.out.println(age);//输出18
//内部类没有的属性,会自动到外面去找,相当于Outer.this.age
//但是此处不能显示指定this.age,否则编译出错!
System.out.println(Outer.this.size);//输出2
}
}
}
public class TestInner {
public static void main(String [] args){
Outer outer = new Outer();
//创建依赖于outer对象的内部类
Outer.Inner inner1 = outer.new Inner();
Outer.Inner inner2 = outer.new Inner();
}
}
说到内部类,只要心里想着这个内存图,就一目了然了。
内部类和静态全局变量好像可以建立联系呢?给不同的内容建立联系,更能够融会贯通。对于静态全局变量而言,它是和类进行静态绑定,每一个对象都拥有这个类的一个同名属性,指向静态数据区的数据。对于每一个内部类,都有一个属性指向它所依赖的外部类对象,因为一个对象可以同时创建多个内部类对象。还真的有异曲同工之妙呢!