目录
一、什么是内部类及为何要有内部类
二、四种内部类
1.成员内部类
成员内部类定义:
获取成员内部类对象的方法:
成员内部类获取外部类变量:
额外:
2.局部内部类
局部内部类定义:
如何实现内部类当中的方法:
3.静态内部类
静态内部类定义
获取静态内部类对象的方法:
静态内部类获取外部变量:
调用静态内部类方法:
4.匿名内部类
一、什么是内部类及为何要有内部类
内部类是指在一个类的内部定义的另一个类。它可以访问外部类的成员,并且可以被外部类的成员访问。
内部类有以下好处:
-
封装性:内部类可以访问外部类的私有成员,这样可以增强了封装性,外部类的私有成员不需要暴露给外部类以外的类,可以被内部类私有化访问。
-
实现多继承:内部类在Java中类似于C++中的多重继承。一个类可以有多个内部类,每个内部类可以继承自不同的类或实现不同的接口,从而实现多继承的效果。
-
隐藏实现细节:内部类可以对实现细节进行隐藏,外部类无法直接访问内部类的方法和属性,只能通过外部类对象来访问。
-
回调机制:通过内部类可以实现回调机制,内部类可以访问外部类的方法和成员,可以在内部类中引用外部类对象的方法,实现回调功能。
-
方便访问外部类的成员:外部类可以访问内部类的私有成员,这使得外部类可以很方便地访问内部类的属性和方法,而不需要通过公共的接口或方法。
-
高级别的封装和模块化:内部类可以将一些逻辑相关的代码集中在一起,使得外部类更加简洁和模块化。内部类可以隐藏在外部类中,只在需要的时候才暴露给外部程序。
二、四种内部类
1.成员内部类
成员内部类定义:
成员内部类是定义在一个类的内部,并直接于类的成员位置,相当于该内部类与外部类当中的成员变量和成员方法处于同等地位。它可以访问外部类的所有成员,包括私有成员。成员内部类的定义格式为:外部类.内部类 内部类对象 = 外部类对象.new 内部类()。
public class OuterClass {private int num;public class InnerClass {public void display() {System.out.println("num:" + num);}}
}
获取成员内部类对象的方法:
OuterClass outerObj = new OuterClass(); // 创建外部类对象
OuterClass.InnerClass innerObj = outerObj.new InnerClass(); // 创建成员内部类对象//或者OuterClass.InnerClass oi = new outerObj().new InnerClass();
请注意:如果成员内部类被私有(private)或受保护(protected)修饰,外部类是无法直接访问和创建成员内部类的对象的。
但仍然有几种方式可以获取成员内部类的对象:
在外部类中提供一个公共的方法来获取成员内部类的对象。在该公共方法中,可以通过创建内部类对象并返回它来实现获取成员内部类的对象。
public class OuterClass {private class InnerClass {// ...}private InnerClass createInnerInstance() {return new InnerClass();}public void outerMethod() {InnerClass innerObj = createInnerInstance();// 使用 innerObj 进行操作}
}
成员内部类获取外部类变量:
成员内部类可以直接调用外部类的变量,但是如果成员内部类当中存在与外部类重名的变量可以参考如下代码:
public class OuterClass {private int outerVariable = 10;public class InnerClass {private int outerVariable = 20;public void printOuterVariable() {System.out.println("Inner variable: " + outerVariable);System.out.println("Outer variable: " + OuterClass.this.outerVariable);}}
}
额外:
在JDK 16以前 是不能在成员内部类里面定影一个静态的变量的
2.局部内部类
局部内部类定义:
局部内部类地位处于外部类的局部位置,与外部类的局部变量处于同等地位。局部内部类是定义在一个方法或作用域内部的类。它只能在所在的方法或作用域内被访问,无法从外部进行访问。局部内部类的定义格式为:在方法或作用域内定义的类。
public class OuterClass {public void display() {class LocalInnerClass {public void print() {System.out.println("局部内部类");}}LocalInnerClass innerObj = new LocalInnerClass();innerObj.print();}
}
局部内部类的对象只能在所在方法或作用域内创建和使用,无法在外部进行访问。
局部内部类的作用范围在定义它的代码块内部,对外部类的其他方法和代码块都是不可见的
该类可直接访问外部类的成员和方法内的局部变量
如何实现内部类当中的方法:
在测试类当中 获取外部类的对象,用该对象来调用包含局部内部类的成员方法
3.静态内部类
静态内部类定义
静态内部类是定义在一个类的内部,且被static修饰的类。静态内部类属于成员内部类的一种,静态内部类独立于外部类的对象存在,可以直接通过外部类访问,即外部类.静态内部类。
public class OuterClass {private static int num;public static class StaticInnerClass {public void display() {System.out.println("静态内部类,num:" + num);}}}
获取静态内部类对象的方法:
OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass(); // 创建静态内部类对象
静态内部类获取外部变量:
静态内部类可以访问外部类的静态成员和非静态成员。如果需要访问外部类的非静态成员,需要通过创建外部类的对象来访问:
OuterClass outerObj = new OuterClass();
outerObj.nonStaticMethod(); // 访问外部类的非静态方法
调用静态内部类方法:
1.非静态方法:需先创建内部类的对象
2.静态方法 :直接Outer.Inner.method();即可
4.匿名内部类
匿名内部类是一种没有命名的内部类,它通常用于创建接口、抽象类的非静态对象。匿名内部类没有构造方法,通过实例初始化块来实现特定的初始化操作。
格式:
interface MyInterface { //接口public abstract void display();//抽象方法
}new MyInterface (){
@Overridepublic void display(){
//重写该方法}
};
匿名内部类会直接实现接口或继承抽象类,并重写方法。创建匿名内部类的同时创建了该类的对象。旨在完成一些简单或者一次性操作的时候不需要创建一些类