- Java教程
- Java - 主页
- Java - 概述
- Java - 环境设置
- Java - 基本语法
- Java - 变量类型
- Java - 基本数据类型
- Java - 基本运算符
- Java 控制语句
- Java - 循环控制
- Java - 决策
- Java - 如果-否则
- Java-开关
- Java - For 循环
- Java - For-Each 循环
- Java - While 循环
- Java - do-while 循环
- Java - 中断
- Java - 继续
- 面向对象编程
- Java - 对象和类
- Java - 方法
- Java - 构造函数
- Java - 访问修饰符
- Java-继承
- Java-多态性
- Java - 重写
- Java-抽象
- Java-封装
- Java - 接口
- Java - 包
- Java - 内部类
- Java 数据类型
- Java - 字符
- Java 文件处理
- Java - 文件和 I/O
- Java 错误与异常
- Java - 异常
- Java多线程
- Java-多线程
- Java同步
- Java-同步
- Java-线程间通信
- Java-线程死锁
- Java-线程控制
- Java网络
- Java-网络
- Java-URL 处理
- Java - 泛型
- Java集合
- Java - 集合
- Java列表接口
- Java - 列表接口
- Java队列接口
- Java - 队列接口
- Java地图接口
- Java - 地图接口
- Java - SortedMap 接口
- Java设置接口
- Java - 设置接口
- Java - SortedSet 接口
- Java数据结构
- Java - 数据结构
- Java-枚举
- Java 集合算法
- Java - 集合
- Java - 迭代器
- Java - 比较器
- Java杂项
- Java - 正则表达式
- Java-序列化
- Java - 发送电子邮件
- Java - Applet 基础知识
- Java - 文档
- Java 有用资源
- Java - 问题与解答
- Java - 快速指南
- Java - 有用的资源
- Java - 讨论
- Java - 示例
Java - 内部类
在本章中,我们将讨论Java的内部类。
嵌套类
在Java中,就像方法一样,类的变量也可以有另一个类作为其成员。Java 允许在另一个类中编写一个类。写在其中的类称为嵌套类,保存内部类的类称为外部类。
句法
以下是编写嵌套类的语法。这里, Outer_Demo类是外部类,Inner_Demo类是嵌套类。
class Outer_Demo { class Inner_Demo { } }
嵌套类分为两种类型 -
非静态嵌套类- 这些是类的非静态成员。
静态嵌套类- 这些是类的静态成员。
内部类(非静态嵌套类)
内部类是Java中的一种安全机制。我们知道一个类不能与访问修饰符private关联,但如果我们将该类作为其他类的成员,则可以将内部类设为私有。这也用于访问类的私有成员。
内部类分为三种类型,具体取决于定义它们的方式和位置。他们是 -
- 内部类
- 方法局部内部类
- 匿名内部类
内部类
创建内部类非常简单。您只需要在类中编写一个类即可。与类不同,内部类可以是私有的,一旦将内部类声明为私有,就无法从类外部的对象访问它。
以下是创建内部类并访问它的程序。在给定的示例中,我们将内部类设为私有并通过方法访问该类。
例子
class Outer_Demo { int num; // inner class private class Inner_Demo { public void print() { System.out.println("This is an inner class"); } } // Accessing he inner class from the method within void display_Inner() { Inner_Demo inner = new Inner_Demo(); inner.print(); } } public class My_class { public static void main(String args[]) { // Instantiating the outer class Outer_Demo outer = new Outer_Demo(); // Accessing the display_Inner() method. 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 variable of the outer class private int num = 175; // inner class 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[]) { // Instantiating the outer class Outer_Demo outer = new Outer_Demo(); // Instantiating the inner class 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; // method-local inner class class MethodInner_Demo { public void print() { System.out.println("This is method inner class "+num); } } // end of inner class // Accessing the inner class 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 interface Message { String greet(); } public class My_class { // method which accepts the object of interface 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[]) { // Instantiating the class My_class obj = new My_class(); // Passing an anonymous inner class as an argument 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