Java 教程
- Java - 首页
- Java - 概述
- Java - 历史
- Java - 特性
- Java 与 C++
- JVM - Java 虚拟机
- Java - JDK 与 JRE 与 JVM
- Java - Hello World 程序
- Java - 环境搭建
- Java - 基本语法
- Java - 变量类型
- Java - 数据类型
- Java - 类型转换
- Java - Unicode 系统
- Java - 基本运算符
- Java - 注释
- Java - 用户输入
- Java - 日期与时间
Java 控制语句
- Java - 循环控制
- Java - 决策制定
- Java - If-else
- Java - Switch
- Java - For 循环
- Java - For-Each 循环
- Java - While 循环
- Java - do-while 循环
- Java - Break
- Java - Continue
面向对象编程
- Java - OOPs 概念
- Java - 对象与类
- Java - 类属性
- Java - 类方法
- Java - 方法
- Java - 变量作用域
- Java - 构造方法
- Java - 访问修饰符
- Java - 继承
- Java - 聚合
- Java - 多态
- Java - 重写
- Java - 方法重载
- Java - 动态绑定
- Java - 静态绑定
- Java - 实例初始化块
- Java - 抽象
- Java - 封装
- Java - 接口
- Java - 包
- Java - 内部类
- Java - 静态类
- Java - 匿名类
- Java - 单例类
- Java - 包装类
- Java - 枚举
- Java - 枚举构造方法
- Java - 枚举字符串
Java 内置类
Java 文件处理
Java 错误与异常
- Java - 异常
- Java - try-catch 块
- Java - try-with-resources
- Java - 多重捕获块
- Java - 嵌套 try 块
- Java - Finally 块
- Java - throw 异常
- Java - 异常传播
- Java - 内置异常
- Java - 自定义异常
Java 多线程
- Java - 多线程
- Java - 线程生命周期
- Java - 创建线程
- Java - 启动线程
- Java - 线程连接
- Java - 线程命名
- Java - 线程调度器
- Java - 线程池
- Java - 主线程
- Java - 线程优先级
- Java - 守护线程
- Java - 线程组
- Java - 关闭钩子
Java 同步
Java 网络编程
- Java - 网络编程
- Java - Socket 编程
- Java - URL 处理
- Java - URL 类
- Java - URLConnection 类
- Java - HttpURLConnection 类
- Java - Socket 类
- Java - 泛型
Java 集合
Java 接口
Java 数据结构
Java 集合算法
高级 Java
- Java - 命令行参数
- Java - Lambda 表达式
- Java - 发送邮件
- Java - Applet 基础
- Java - Javadoc 注释
- Java - 自动装箱和拆箱
- Java - 文件不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 文件
- Java - 私有接口方法
- Java - 内部类菱形运算符
- Java - 多分辨率图像 API
- Java - 集合工厂方法
- Java - 模块系统
- Java - Nashorn JavaScript
- Java - Optional 类
- Java - 方法引用
- Java - 函数式接口
- Java - 默认方法
- Java - Base64 编码解码
- Java - Switch 表达式
- Java - Teeing 收集器
- Java - 微基准测试
- Java - 文本块
- Java - 动态 CDS 存档
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指针异常
- Java - 打包工具
- Java - 密封类
- Java - 记录类
- Java - 隐藏类
- Java - 模式匹配
- Java - 紧凑数字格式化
- Java - 垃圾回收
- Java - JIT 编译器
Java 杂项
- Java - 递归
- Java - 正则表达式
- Java - 序列化
- Java - 字符串
- Java - Process API 改进
- Java - Stream API 改进
- Java - 增强的 @Deprecated 注释
- Java - CompletableFuture API 改进
- Java - 流
- Java - 日期时间 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java API 与框架
Java 类参考
- Java - Scanner
- Java - 数组
- Java - 字符串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用资源
Java - 内部类
Java 内部类
Java 内部类是在另一个类内部定义的类。内部类的概念与嵌套 Java 类一起使用,其中使用外部类和内部类。定义内部类的主要类称为外部类,而外部类内部的所有其他类都称为Java 内部类。
嵌套类
在 Java 中,就像方法一样,类的变量也可以拥有另一个类作为其成员。在 Java 中允许在一个类中编写另一个类。在内部编写的类称为嵌套类,包含内部类的类称为外部类。
语法
以下是编写嵌套类的语法。在这里,类Outer_Demo是外部类,类Inner_Demo是嵌套类。
class Outer_Demo {
class Inner_Demo {
}
}
嵌套类分为两种类型 -
非静态嵌套类 - 这些是类的非静态成员。
静态嵌套类 - 这些是类的静态成员。
内部类(非静态嵌套类)
内部类是 Java 中的一种安全机制。我们知道一个类不能与访问修饰符private相关联,但是如果我们将该类作为另一个类的成员,则可以将内部类设为私有。这还用于访问类的私有成员。
Java 内部类的类型
内部类根据您定义它们的方式和位置分为三种类型。它们是 -
- 内部类
- 方法局部内部类
- 匿名内部类
创建内部类
创建内部类非常简单。您只需要在一个类中编写一个类即可。与类不同,内部类可以是私有的,并且一旦您将内部类声明为私有的,就无法从类外部的对象访问它。
以下是创建内部类并访问它的程序。在给定的示例中,我们将内部类设为私有,并通过方法访问该类。
示例:在 Java 中创建内部类
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