java 内部类与外部类的区别

最近在看Java相关知识的时候发现Java中同时存在内部类以及非公有类概念,而且这两个类都可以不需要单独的文件编写,可以与其他类共用一个文件。现根据个人总结将两者的异同点总结如下,如有什么不当地方,欢迎大家指正。

1、非公有类和内部类对应的文件名与这两种类的类名无关;

2、一个源文件中可以包含多个非公有类或者内部类;

3、非公有类不能使用public关键字(一般前面不加关键字),内部类可以使用public、private、protected关键字;

4、非公有类中可以添加0到多个内部类;

5、非公有类是包可见的,一个包中只能有一个同名非公有类,所以在包外无法调用非公有类;但是在包外可以通过包中外部类对象调用该包中的内部类

6、非公有类在源文件中直接调用,例如,在源文件Test.java中存在一个公有类Test,一个非公有类priTest,那么可以使用preTest pt = new preTest() 实例化一个非公有类的对象;而对于内部类,在非静态方法外部必须使用外部类的对象来调用内部类的构造方法,例如在源文件Outer.java中存在一个外部类Outer,一个内部类Inner,那么使用以下方式调用内部类:Outer out = new Outer(),Inner in = out.new Inner()。在非静态方法内部直接使用new类实例化内部类对象,即Inner in = new Inner()

7、非公有类只能通过创建公有类对象实现对于公有类的成员变量的使用,而内部类可以随意使用外部类的成员变量(包括私有变量)而不用生成外部类的对象。

8、如果源文件中有一个公有类和多个非公有类,在编译的时候编译器会为文件中每个类创建一个单独的.class文件,文件名就是对应的类名(所以一个包中只能有一个同名的非公有类);假如一个文件中有一个外部类,多个内部类,则在编译的时候也会为每个类创建一个.class文件,但是内部类对应的文件名为"外部类$内部类.class",$代表这个内部类所属的外部类。

9、在内部类中访问变量有三种形式:
a、变量名--访问局部变量;
b、this.变量名--访问内部类变量;
c、外部类名.this.变量名--访问外部类变量。

如果内部类没有同名成员变量和局部变量,内部类可以直接通过变量名访问外部类变量,而不用指定"外部类名.this.变量名"。

10、如果一个内部类是静态内部类,使用关键字static,则内部类只能访问外部类的静态成员变量,同时可以将"外部类名.内部类名"看成一个整体,直接new出内部类的对象,而不用先生成外部类对象,例如外部类为Out,静态内部类为In,则可以使用Out.In in = new Out.In()直接创建内部类对象。

11、如果一个内部类是“私有的”,则该类只能在外部类中生成对象进行操作,而无法再使用Out.In in = new Out().new In()生成内部类对象。

原文地址:https://www.cnblogs.com/mophy/p/5978141.html