Java-内部类、对象打印

一、内部类

1. 实例内部类

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】外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

2. 静态内部类

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】创建静态内部类对象时,不需要先创建外部类对象

3. 局部内部类

public class Test {
    public void func() {
        //局部内部类
        class Inner {
            public void test() {
                System.out.println("局部内部类\\");
            }
        }
    }
        
    //main..
    ...
}

注意事项:

【1】 局部内部类只能在所定义的方法体内部使用

【2】不能被public、static等修饰符修饰

【3】几乎不会使用

注:内部类的字节码文件与普通类不同:外部类$内部类.class

4. 匿名内部类

public class Test {
    public static void main(String[] args) {
        new Person(){
          //匿名内部类
        };
    }
}

匿名对象:只能使用一次,每次要用都要new一个新的对象出来

二、对象打印

正常情况下:打印对象是打印出:对象路径@对象“地址”(地址其实是哈希值)

通过探索打印方法的源码可以看到底层是用toString方法层层返回打印的,所以只需要重写toString方法就可以打印出自己想打印的内容。

你可能感兴趣的:(JavaSE,java,开发语言)