内部类
原文: https://javabeginnerstutorial.com/core-java-tutorial/inner-class/
Java 内部类是类中的类。 内部类实例与外部类具有特殊关系。 这种特殊的关系使内部类可以访问外部类的成员,就好像它们是外部类的一部分一样。
注意:Java 内部类实例可以访问外部类的所有成员(公开,私有和受保护)
创建内部类的语法
//outer class
class OuterClass {
//inner class
class InnerClass {
}
}
内部类的类型
- 静态
- 方法局部
- 匿名
- 除了这些正常的内部类之外
普通内部类
非方法局部,静态方法或匿名方法的内部类是普通内部类。
//outer class
class OuterClass {
//inner class
class InnerClass {
}
}
如果编译以上代码,它将生成两个类文件。
outer.class
inner$outer.class
注意:您无法使用java命令直接执行内部类的.class文件。
由于它不是静态内部类,因此我们不能对其使用static
关键字。
如何访问内部类
内部类只能通过外部类的活动实例进行访问。
通过外部类
外部类可以以与普通类成员相同的方式创建内部类的实例。
class OuterClass {
private int i = 9;
// Creating instance of inner class and calling inner class function
public void createInner() {
InnerClass i1 = new InnerClass();
i1.getValue();
}
// inner class declarataion
class InnerClass {
public void getValue() {
// accessing private variable from outer class
System.out.println("value of i -" + i);
}
}
}
从外部类外面
创建一个外部类实例,然后创建内部类实例。
class MainClass {
public static void main(String[] args) {
// Creating outer class instance
OuterClass outerclass = new OuterClass();
// Creating inner class instance
OuterClass.InnerClass innerclass = outerclass.new InnerClass();
// Classing inner class method
innerclass.getValue();
}
}
上面的代码也可以替换为
OuterClass.InnerClass innerClass = new OuterClass.new InnerClass();
this关键字
有一些与相关的规则,它引用当前正在执行的对象。 因此,在内部类中,“this
”关键字将引用当前正在执行的内部类对象。 但是要获取外部类的代码,请使用“OuterClass.this
”。
应用的修饰符
普通内部类将被视为外部类的成员,因此与类相反,它可以具有多个修饰符。
final
abstract
public
private
protected
strictfp
注意:不要与“类”和“内部类”的修饰符混淆。 他们是完全不同的。
方法局部内部类
当在外部类的方法内部定义内部类时,它将成为方法局部内部类。
用于创建方法局部内部类的语法
class OuterClass {
private int i = 9;
// Creating instance of inner class and calling inner class function
public void innerMethod() {
// inner class declarataion inside method
class InnerClass {
public void getValue() {
// accessing private variable from outer class
System.out.println("value of i -" + i);
}
}
//inner class instance creation
InnerClass i1 = new InnerClass();
i1.getValue();
}
}
现在,内部类的定义位于外部类的方法内部。 仍然可以创建外部类的实例,但是只能在定义内部类之后才能创建,如上面所示。
注意:
- 方法局部内部类可以在定义它的方法内实例化,而不能在其他地方实例化。
- 方法本地内部类不能使用在其 ID 定义的方法中定义的变量,但仍可以使用实例变量。
- 如果方法局部变量是“最终的”,则方法局部内部类可以使用它。 (现在变量是最终的)
应用于方法局部内部类的修饰符
方法局部内部类可以使用修饰符(例如局部变量),因此方法局部内部类可以具有final
或abstract
。
备忘单
- 内部类是包含在类中的成员。
- 外部类引用需要启动内部类。
- 内部类有 4 种类型。
- 在方法内定义的内部类是方法局部内部类。
- 方法局部内部类不能访问方法局部变量。
final
和abstract
是可用于方法内部内部类的唯一修饰符。- 匿名内部类没有任何名称。
- 具有静态修饰符的内部类称为静态内部类。
- 静态嵌套类无法访问外部类的非静态成员。