本文共 3555 字,大约阅读时间需要 11 分钟。
Java 内部类是一种在现有类内部定义新类的方式,支持成员内部类、局部内部类以及匿名内部类等多种形式。本文将详细探讨Java 内部类的概念、分类、使用方法以及具体实现细节。
Java 内部类主要分为以下几种类型:
成员内部类
成员内部类是定义在外部类的成员位置(如方法、字段)内部的类。与外部类具有“所属关系”,可以直接访问外部类的成员变量和方法。局部内部类
定义在方法或块内部的类。只能在定义它的方法或块中使用,方法结束后该类将失去作用。匿名内部类
没有名字的内部类,通常用于实现接口或其他只需一次使用的类。其定义方式简洁,省略了类名的声明。成员内部类的定义语法如下:
修饰符 class 外部类名称 { 修饰符 class 内部类名称 { // 内部类的方法和字段 }} 以下示例展示了成员内部类的使用场景:
public class Body { public class Heart { public void beat() { System.out.println("内部类方法"); System.out.println(name); // 内部类使用外部类成员变量 method(); // 内部类调用外部类成员方法 } } private String name; public void method() { System.out.println("外部类方法"); new Heart().beat(); // 外部类调用内部类方法 }} 调用成员内部类有两种方式:
public class Body { private String name; public void method() { System.out.println("外部类方法"); new Heart().beat(); // 间接方式调用内部类 } public static void main(String[] args) { Body body = new Body(); body.method(); // 通过外部类对象调用 }} public class Body { public class Heart { public void beat() { System.out.println("内部类方法"); } } public static void main(String[] args) { Body.Heart heart = new Body().new Heart(); // 直接方式创建内部类对象 heart.beat(); }} 当内部类和外部类拥有同名变量时,如何正确访问?可以使用 外部类名称.this 来区分:
public class Out { int num = 10; // 外部类成员变量 public class inner { int num = 20; // 内部类成员变量 public void method() { int num = 30; // 局部变量 System.out.println(num); // 局部变量:30 System.out.println(this.num); // 内部类成员变量:20 System.out.println(Out.this.num); // 外部类成员变量:10 } }} 局部内部类定义在方法或块内部,仅在该方法或块中可用:
public class Outer { public void method() { class Iner { public void methodIner() { System.out.println("局部内部类方法"); } } Iner iner = new Iner(); iner.methodIner(); }} final 关键字若局部内部类需要访问所在方法的局部变量,则该变量必须为 final:
public class MyOuter { public void methodOuter() { final int num = 10; // 所在方法的局部变量 class MyInner { public void methodInner() { System.out.println(num); } } }} 从 Java 8 开始,若局部变量事实不变,可以省略 final 关键字。
匿名内部类适用于需要一次实现接口或子类的场景:
public class Demo02N { public static void main(String[] args) { MyInterface obj = new MyInterface() { @Override public void method() { System.out.println("匿名内部类实现了方法"); } }; obj.method(); }} 匿名内部类的优点是简洁,但需要注意以下几点:
new 接口名称() {} 中的 new 创建对象,接口名称 为实现接口,{} 为匿名类内容。以下示例展示了匿名内部类的多次使用:
public class Demo02N { public static void main(String[] args) { MyInterface obja = new MyInterface() { @Override public void method() { System.out.println("匿名内部类实现了方法"); } }; obja.method(); MyInterface objb = new MyInterface() { @Override public void method() { System.out.println("匿名内部类实现了方法"); } }; objb.method(); new MyInterface() { @Override public void method() { System.out.println("匿名内部类实现了方法"); } }.method(); }} 转载地址:http://trrwz.baihongyu.com/