《Java 2实用教程第6版》中P176中有4点是介绍内部类的,但我总觉得前两点不怎么对劲。

先说说我自己的理解,为什么内部类的外嵌类的成员变量在内部类中仍然有效?为什么内部类中的方法也可以调用外嵌类中的方法?因为ava就是这样设计的,所以是这样的?

这就回顾一下,我们平时是怎么调用类里面的实例方法与成员变量?用对象是吧?那对象怎么找到这个实例方法或者成员变量呢?引用,所以我认为这里的内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法是因为在实例化内部类的过程中,内部类的对象包含了外部类对象的引用。所以他就能调用外嵌类的实例方法和成员变量了。

这句话我认为是错的,静态内部类呢?静态内部类怎么就不能有类方法了?

然后再仔细想一想,第一点就又有问题了,静态内部类的实例化是不需要外嵌类对象的,也就是说静态内部类对象是没有外嵌类对象的引用的。所以静态内部类对象无法操作外嵌类的实例方法与成员变量。

所以,可以确定,这书里对内部类的4点介绍是指的非静态内部类。

还有一点是我在测试的时候遇到的

class Embeddedclass {
    class InsideClass {
        static int i = 1;
        void f() {
            System.out.print("i am a Inner class method." + i);
        }
    }
}

public class InsideTest {
    public static void main(String[] args) {
        Embeddedclass g = new Embeddedclass();
        Embeddedclass.InsideClass gg = g.new InsideClass();
        gg.f();
    }
}

仔细看,这InsideClass类是一个非静态的内部类,然后他还有一个static的变量i,我一开始以为它会报错,想着会有什么提示运行了它。

运行结果

但奇迹发生了,不仅编译成功,而且运行也没问题。那书里为什么说内部类的类体中不可以声明类变量和类方法?这问题我想了好久,最后也只能找度娘。

在JDK1.8 以后,没有final修饰,effectively final的即可。什么意思呢?就是没有final修饰,但是如果加上final编译器也不会报错即可。

Java -- 成员内部类不能含有static成员(汇总)

匿名类的特点有哪些_Java 干货之深入理解内部类

最后修改:2022 年 03 月 31 日
如果觉得我的文章对你有用,请随意赞赏