内部类 一、内部类inner class1、定义:允许一个类的定义出现在另一个类中,将处于另一个类中的“寄生类”2、一个类有属性方法,还可以有内部类一个类A定义在另一个类B中,那A就是
一、内部类inner class 1、定义:允许一个类的定义出现在另一个类中,将处于另一个类中的“寄生类” 2、一个类有属性方法,还可以有内部类一个类 A定义在另一个类B中,那A就是B的内部类; A和B在逻辑上是一个整体,A和B之间是从属关系; 3、作用:内部类A可以访问外部类B的私有属性; 内部类A的作用范围仅在于外部类B的内部有效; 外部类B的方法是可以访问内部类A的; 内部类A的对象必须通过外部类B对象创建,并且和外部类B对象关联, 所以又称--------实例内部类; 4、实例:Outer.java 测试类:TestInner.java class Outer { private int size; /* * 内部类:继承、实现接口类的 * * */ //private class Inner 内部类私有,创建对象只能在外部类里的方法中创建对象 public class Inner{ int size = 10; public void doStuff() { size++; //内部类可以访问外部类的私有属性 Outer.this.size++; //System.out.println("outer size = "+Outer.this.size); } public int getOuterSize() { System.out.println("outer size = "+Outer.this.size); return size; } } public void testTheInner() { Inner i = new Inner(); i.doStuff(); System.out.println("inner size = "+i.getOuterSize()); } } public class TestInner { public static void main(String[] args) { Outer a = new Outer();//创建外部类对象 Outer.Inner i = a.new Inner(); i.doStuff(); System.out.println("Inner size = "+i.getOuterSize()); System.out.println("-----------------------------"); a.testTheInner(); System.out.println("-----------------------------"); System.out.println("Inner size ="+i.getOuterSize()); } } PS: JVM加载TestInner.java后,会生成TestInner.class,Outer.class,还有Outer$Inner.class三个字节码文件,加载到方法区的类代码区; 内部类字节码文件命名规范:外部类名$内部类名.class 5、外部类里面创建内部类对象,可以在外部类的方法中创建; 在外部类外面创建内部类对象,必须先创建外部类对象,再创建内部类。 6、私有内部类: 一旦一个内部类是私有的,那该内部类的对象只能在该外部类的方法中创建 私有内部类也可以继承,也可以实现接口。 内部类一旦私有,省略名字→匿名类 二、方法内部类/局部内部类:定义在一个外部类的方法里 1、该内部类对象只能在该方法中创建,只能在该方法里有效; 2、有几个类就有几个字节码文件,该内部类的字节码文件也是: 外部类名$内部类名.class 3、创建一个外部类对象o,调用o的定义了方法内部类的方法,把内部类加载到内存,如果需要创建内部类对象,那就按照内部类的模板,创建一个内部类对象,但是该内部类对象的作用范围仅在包含他的这个方法里 4、方法内部类的对象也有其关联的外部类对象的引用 5、方法内部类只能访问该方法里的final修饰的局部变量 PS:输出一个对象的地址,其实是调用这个类的toString方法