内部类 一、内部类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方法
