class OuterCLass{
public int data1;
int data2;
public static int data3;
public void test() {
System.out.println("OuterClass::test()");
}
class InnerClass{
public int data4;
int data5;
public void func() {
System.out.println("InnerClass::test()");
}
}
}
(1)获取实例内部类的对象
public class Test {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
//要先有外部类的引用才能.出内部类对象
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
}
}
(2)实例内部类中不能有静态的成员变量,如果非要定义,那么只能是被static final修饰的
但在实例内部类中加上final关键字就不会报错了
public static final int data6 = 10;
注:final关键字定义常量,定义之后则常量不可改变
(3)在实例内部类中,访问外部类当中相同的成员变量:
在实例内部类中获取外部类的this:
OuterClass.this.data1;
注意事项:
【1】 外部类中的任何成员都可以在实例内部类方法中直接访问
【2】实例内部类所处的位置与外部类位置相同,因此也受public、private等访问限定符的约束
【3】在实例内部类方法中访问同名成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
【4】实例内部类对象必须先有外部类对象前提下才能创建
【5】实例内部类的非静态方法中包含了一个指向外部类对象的引用
【6】外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
static class InnerClass2 {
public int data4 = 4;
int data5 = 5;
public static int data6 = 6;
public void func() {
System.out.println("out::func()");
}
}
(1)获取静态内部类对象
OutClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();
注:new后面的OuterClass2.InnerClass2()是一个整体
(2)静态内部类中不能访问外部类的非静态成员。外部类的非静态成员,需要通过外部类对象的引用才能访问。非要访问:
//main
OuterClass2 outerClass = new OuterClass2();
System.out.println(outerClass.data1);
注意事项:
【1】在静态内部类中只能访问外部类中的静态成员
【2】创建静态内部类对象时,不需要先创建外部类对象
public class Test {
public void func() {
//局部内部类
class Inner {
public void test() {
System.out.println("局部内部类\\");
}
}
}
//main..
...
}
注意事项:
【1】 局部内部类只能在所定义的方法体内部使用
【2】不能被public、static等修饰符修饰
【3】几乎不会使用
注:内部类的字节码文件与普通类不同:外部类$内部类.class
public class Test {
public static void main(String[] args) {
new Person(){
//匿名内部类
};
}
}
匿名对象:只能使用一次,每次要用都要new一个新的对象出来
正常情况下:打印对象是打印出:对象路径@对象“地址”(地址其实是哈希值)
通过探索打印方法的源码可以看到底层是用toString方法层层返回打印的,所以只需要重写toString方法就可以打印出自己想打印的内容。