内部类
内部类
内部类就是在一个类的内部定义一个类。在A类中定义了一个B类,那么B类对于A类来说就是内部类,A类对于B类来说就是外部类。具体分为:
- 成员内部类
- 局部内部类
- 匿名内部类
- 静态内部类
作用:
- 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整。
- 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
- 方便编写事件驱动程序。
- 方便编写线程代码。
1.成员内部类
当某个类出现在另一个类中代码块或方法外,这个类就是成员内部类。不会被其他类使用时应该选在成员内部类。使用成员内部类可以获得外部类的某些私有属性。
特点:
- 出现位置为类中代码块或方法外。
- 成员内部类可以无条件访问外部类的所有成员属性和方法(包括私有属性和私有方法)。
- 同名属性名、方法名时,访问外部类:外部类.this.成员名。
- 成员内部类是依附外部类而存在的。创建内部类对象,就必须创建一个外部类对象。外部类访问内部类时必须先实例化外部类对象。
- 成员内部类可以使用四种修饰权限符进行修饰。
- 成员内部类中不能写静态变量和方法。
代码如下
public class Outer {
private int id = 20220419;
String name = "张三";
static String country = "中国";
public Outer(){}
public Outer(String name) {
this.name = name;
}
private void run(){
System.out.println("掉用外部类中的非静态方法");
}
//成员内部类 可以使用权限修饰符进行修饰
public class Inter{
String name = "宝马";//成员内部类中不能使用static修饰变量和方法
public Inter(){}
public Inter(String name) {
this.name = name;
}
public void method1(){
run();//成员内部类可以直接访问外部类的属性和方法
System.out.println(id);
System.out.println(name);//访问的是内部类的name
System.out.println(Outer.this.name);//访问的是外部类的name
}
}
public static void main(String[] args) {
//访问成员内部类的步骤
//第一步:实例化外部类对象
//第二步:实例化外部类对象,但是new关键字要改成 外部类对象名.new
Outer outer = new Outer();
Inter inter = outer.new Inter();
inter.method1();
}
}
结果显示:
掉用外部类中的非静态方法
20220419
宝马
张三
2.局部内部类
编写在方法内的类叫做局部内部类
特点:
- 局部内部类的位置是外部类的方法或代码块内。
- 作用域为:仅限于方法内或者代码块内
- 局部内部类不可以使用权限修饰符(public、private、protected和default),同局部变量相同。
- 局部内部类能够直接访问方法中的属性。
- 局部内部类能够直接访问方法外类中的属性和方法(不包括私有方法)
- 局部内部类 创建对象 要在 方法内部局部内部类的外部 声明
``
public class Outer1 {
private int id = 20220419;
String name = "张三";
static String country = "中国";
public Outer1(){}
public Outer1(String name) {
this.name = name;
}
private void run(){
System.out.println("调用外部类中的非静态方法");
}
private static void show(){
System.out.println("调用外部类中的静态方法");
}
public void method23(){
System.out.println("调用外部类中的公有方法");
}
public void method(){
String name = "李四";
int age = 34;
//编写静态变量
class Inner1{
String name = "王五";
public void methodInner(){
run();
method23();//外部类公有方法
show();//外部类私有方法
System.out.println(id);//外部私有属性
System.out.println(country);//外部静态属性
System.out.println(age);//方法局部变量
System.out.println(name);//此时访问的是内部类的name,和this.name是一样的
System.out.println(this.name);
System.out.println(Outer1.this.name);
}
public void methodInner2(String name){
run();
method23();//外部类公有方法
show();//外部类私有方法
System.out.println(id);//外部私有属性
System.out.println(country);//外部静态属性
System.out.println(age);//方法局部变量
System.out.println(name);//此时调用的是传进来的方法中的局部变量,和this.不一样
System.out.println(this.name);
System.out.println(Outer1.this.name);
}
}
Inner1 inner1 = new Inner1();
inner1.methodInner2(name);
}
public static void main(String[] args) {
Outer1 outer1 = new Outer1();
outer1.method();
}
}
结果显示:
调用外部类中的非静态方法
调用外部类中的公有方法
调用外部类中的静态方法
20220419
中国
34
李四
王五
张三
结果分析:methodInner和methodInner2,一个输入参数,一个未输入参数,输入参数输入的name为局部变量,而未输入参数name为内部类的name等同this.name
3.匿名内部类
匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
``
interface A1{
void show();
}
public class Outer2 {
//编写回调方法 参数类型为接口A
public void calllnner(A1 a) {
a.show();
}
public static void main(String[] args) {
Outer2 outer2 = new Outer2();
//匿名内部类 监听事件使用较多
outer2.calllnner(new A1() {//接口回调
//实现子类 但是没有名字 所以叫匿名内部类
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("show");
}
});
}
}
或许有些难以理解 过程其实并不复杂
首先有一个接口,然后在使用的类中编写了一个方法(参数类型是接口对象),并使用接口中未实现的方法。
我们调用此方法直接构造一个接口对象传入,此时会自动生成一个此接口的子类(匿名内部类)实现接口中的方法。本质传入的类便是此时的匿名内部类。
4.静态内部类
在类中编写的以static修饰的类叫做静态内部类
特点:
- 静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。
- 静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。除此之外静态内部类和普通的类一样。
- 静态内部类中即能声明静态成员也可以声明非静态成员。
分类:
java基础知识(javaSE)
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术