JAVA内部类中的一个小知识点

一.内部类概述
在JAVA的一个类中可以嵌套一个类的定义,嵌套定义的那个类就是所谓的内部类。如果这个内部类不是一个静态内部类,下面的讨论就是针对非静态的内部类而言的。那么该内部类对其外部类的所有成员都有访问权限,就好像内部类拥有外部类的这些成员一样。那么这是怎么做的呢?其实很简单,内部类中保存了一个外部类的引用,通过这个引用,内部类可以访问外部类的所有成员,既然是通过这个引用来实现的,那么创建内部类对象时必须要获取到这样一个外部类的引用,只有这样才能保证上面的机制。

二.看一段源代码
public class Parcel2 {
    private int num = 0;
    class Contents {
        private int i = 11;
        int value() {
            // 4.使用外围类的this引用访问私有成员变量num
            this.i = Parcel2.this.num;
            // this.i = num;
            return i;
        }
    }
    class Destination {
        private String label;
        Destination(String whereTo) {
            this.label = whereTo;
        }
        String readLabel() {
            return this.label;
        }
    }
    public Destination to(String s) {
        // 1.直接使用内部类的名字
        return new Destination(s);
    }
    public Contents contents() {
        // 2.直接使用内部类的名字
        return new Contents();
    }
    
    public static void main(String[] args) {
        Parcel2 p = new Parcel2();
        // 3.这里不能直接使用内部类的名字
        Contents c1 = p.new Contents();
    }
}



    1.看看上述源代码,我们发现这样一个规律,在外围类的非静态方法中创建一个内部类对象,此时不需要.new语法,直接创建即可,因为调用非静态方法的时候,会把this对象隐式传递进来,所以不需要.new语法来告诉它外围对象的引用。但是在静态方法中创建内部类的对象时,内部类是无法获取外围类的引用的,因为调用静态方法时外围类的引用不会隐式传递到方法的内部的


    2.看看注释中的第四点,在内部类中我们可以使用外内名称.this来获取到外围类的引用,通过这个引用可以访问外围类的成员,当然访问外围类的成员未必需要显式的使用这个this引用。

你可能感兴趣的:(java)