Java教程-Java成员内部类
Java成员内部类
在类的内部但方法之外创建的非静态类称为成员内部类。它也被称为常规内部类。它可以使用public、default、private和protected等访问修饰符进行声明。
语法:
class Outer{
//代码
class Inner{
//代码
}
}
Java成员内部类示例
在此示例中,我们在成员内部类中创建了一个msg()方法,该方法访问了外部类的私有数据成员。
TestMemberOuter1.java
class TestMemberOuter1{
private int data=30;
class Inner{
void msg(){System.out.println("data is "+data);}
}
public static void main(String args[]){
TestMemberOuter1 obj=new TestMemberOuter1();
TestMemberOuter1.Inner in=obj.new Inner();
in.msg();
}
}
输出:
data is 30
如何在Java中实例化成员内部类?
成员内部类的对象或实例始终存在于其外部类的对象内部。使用new运算符以稍微不同的语法创建成员内部类的对象。
创建成员内部类对象的通用语法形式如下:
语法:
OuterClassReference.new MemberInnerClassConstructor();
示例:
obj.new Inner();
这里,OuterClassReference是外部类的引用,后面跟着一个点,然后是new运算符。
Java成员内部类的内部工作原理
在内部类的情况下,Java编译器会创建两个类文件。内部类的类文件名为"Outer$Inner"。如果要实例化内部类,必须创建外部类的实例。在这种情况下,内部类的实例将在外部类的实例内部创建。
编译器生成的内部代码
在这种情况下,Java编译器会创建一个名为Outer$Inner的类文件。成员内部类具有Outer类的引用,因此它可以访问Outer类的所有数据成员,包括私有成员。
import java.io.PrintStream;
class Outer$Inner
{
final Outer this$0;
Outer$Inner()
{ super();
this$0 = Outer.this;
}
void msg()
{
System.out.println((new StringBuilder()).append("data is ")
.append(Outer.access$000(Outer.this)).toString());
}
}