Java 中的内部类
嵌套类
在 Java 中,与方法一样,一个类的变量也可以将另一个类作为其成员。在 Java 中,允许在一个类中编写另一个类。在类中编写的类称为嵌套类,而包含内部类的类称为外部类。
语法
以下是编写嵌套类的语法。这里,类 Outer_Demo 是外部类,类 Inner_Demo 是嵌套类。
class Outer_Demo { class Inner_Demo { } }
嵌套类分为两种类型 −
非静态嵌套类 − 这些是类的非静态成员。
静态嵌套类 − 这些是类的静态成员。
内部类(非静态嵌套类)
内部类是 Java 中的一种安全机制。我们知道一个类不能与访问修饰符 private 关联,但如果我们将该类作为其他类的成员,则可以将内部类设置为私有。这也用于访问类的私有成员。
内部类根据定义方式和位置分为三种类型。它们是 −
- 内部类
- 方法局部内部类
- 匿名内部类
内部类
创建内部类非常简单。只需在类中编写一个类即可。与类不同,内部类可以是私有的,并且一旦声明内部类为私有,类外部的对象就无法访问它。
以下是创建并访问内部类的程序。在给定的示例中,我们将内部类声明为私有,并通过方法访问该类。
示例
class Outer_Demo { int num; // 内部类 private class Inner_Demo { public void print() { System.out.println(&"This is an inner class&"); } } // 从内部方法访问内部类 void display_Inner() { Inner_Demo inner = new Inner_Demo(); inner.print(); } } public class My_class { public static void main(String args[]) { // 实例化外部类 Outer_Demo outer = new Outer_Demo(); // 访问 display_Inner() 方法。 outer.display_Inner(); } }
这里您可以观察到 Outer_Demo 是外部类,Inner_Demo 是内部类,display_Inner() 是我们实例化内部类的方法,该方法由 main 方法调用。
如果您编译并执行上述程序,您将得到以下结果 −
输出
This is an inner class
访问私有成员
如前所述,内部类也用于访问类的私有成员。假设一个类拥有私有成员,您可以编写一个内部类,并通过内部类中的方法(例如 getValue())返回私有成员,最后从另一个类(您希望从中访问私有成员)调用内部类的 getValue() 方法。
要实例化内部类,首先必须实例化外部类。然后,使用外部类的对象,按照以下方式实例化内部类。
Outer_Demo outer = new Outer_Demo(); Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
以下程序演示了如何使用内部类访问类的私有成员。
示例
class Outer_Demo { // 外部类的私有变量 private int num = 175; // 内部类 public class Inner_Demo { public int getNum() { System.out.println("This is the getnum method of the inner class"); return num; } } } public class My_class2 { public static void main(String args[]) { // 实例化外部类 Outer_Demo outer = new Outer_Demo(); // 实例化内部类 Outer_Demo.Inner_Demo inner = outer.new Inner_Demo(); System.out.println(inner.getNum()); } }
编译并执行上述程序,将得到以下结果 −
输出
This is the getnum method of the inner class: 175
方法局部内部类
在 Java 中,我们可以在方法中编写一个类,这将是一个局部类型。与局部变量一样,内部类的作用域也限制在方法内部。
方法局部内部类只能在定义它的方法内实例化。以下程序展示了如何使用方法局部内部类。
示例
public class Outerclass { // instance method of the outer class void my_Method() { int num = 23; // 方法局部内部类 class MethodInner_Demo { public void print() { System.out.println(&"This is method inner class &"+num); } } // 内部类结束 // 访问内部类 MethodInner_Demo inner = new MethodInner_Demo(); inner.print(); } public static void main(String args[]) { Outerclass outer = new Outerclass(); outer.my_Method(); } }
编译并执行上述程序,将得到以下结果 −
输出
This is method inner class 23
匿名内部类
声明时未指定类名的内部类称为匿名内部类。对于匿名内部类,我们会同时声明和实例化它们。通常,当需要重写类或接口的方法时,会使用它们。匿名内部类的语法如下 −
语法
AnonymousInner an_inner = new AnonymousInner() { public void my_method() { ........ ........ } };
以下程序显示如何使用匿名内部类覆盖类的方法。
示例
abstract class AnonymousInner { public abstract void mymethod(); } public class Outer_class { public static void main(String args[]) { AnonymousInner inner = new AnonymousInner() { public void mymethod() { System.out.println("This is an example of anonymous inner class"); } }; inner.mymethod(); } }
如果你编译并执行上述程序,你将得到以下结果 −
输出
This is an example of anonymous inner class
同样,您可以使用匿名内部类重写具体类和接口的方法。
匿名内部类作为参数
通常,如果一个方法接受接口、抽象类或具体类的对象,那么我们可以实现该接口,扩展该抽象类,然后将该对象传递给该方法。如果是类,则可以直接将其传递给该方法。
但在这三种情况下,您都可以将匿名内部类传递给该方法。以下是将匿名内部类作为方法参数传递的语法 −
obj.my_Method(new My_Class() { public void Do() { ..... ..... } });
以下程序演示了如何将匿名内部类作为方法参数传递。
示例
// 接口 interface Message { String greet(); } public class My_class { // 接受 Message 接口对象的方法 public void displayMessage(Message m) { System.out.println(m.greet() + ", This is an example of anonymous inner class as an argument"); } public static void main(String args[]) { // 实例化类 My_class obj = new My_class(); // 将匿名内部类作为参数传递 obj.displayMessage(new Message() { public String greet() { return "Hello"; } }); } }
如果你编译并执行上述程序,它会给出以下结果 −
输出
Hello, This is an example of anonymous inner class as an argument
静态嵌套类
静态内部类是一种嵌套类,它是外部类的静态成员。无需实例化外部类,即可使用其他静态成员访问它。与静态成员一样,静态嵌套类无法访问外部类的实例变量和方法。静态嵌套类的语法如下 −
语法
class MyOuter { static class Nested_Demo { } }
实例化静态嵌套类与实例化内部类略有不同。以下程序演示了如何使用静态嵌套类。
示例
public class Outer { static class Nested_Demo { public void my_method() { System.out.println("This is my nested class"); } } public static void main(String args[]) { Outer.Nested_Demo nested = new Outer.Nested_Demo(); nested.my_method(); } }
如果你编译并执行上述程序,你将得到以下结果 −
输出
This is my nested class