一文带你快速了解【内部类】

1. 什么是内部类?

在一个类 A 中,又定义了一个类 B ,此时这个类 B 就是内部类,而类 A 则是外部类!内部类也是一种封装得表现

public class A{
	class B{
	
	}
}

我们看上面代码,此时 A 就是外部类,B 就是内部类

  • 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件
  • 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类

2. 内部类的分类

内部类又分为成员内部类局部内部类 下面我们来一一介绍下

2.1 成员内部类

2.1.1 静态内部类

我们先来看是如何定义的

class OuterClass{

	static class InnerClass{

	}
}

此时的 InnerClass 就是静态内部类,因为被 static 修饰


既然是一个类,那么应该如何 来实例化一个静态内部类呢?

public class Test{
	public static void main(String[] args){
		OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
	}
}

那么在静态内部类种,如何访问自己的成员变量和外部类的成员变量呢?
在这里插入图片描述
从图种,我们可以直接看出,当访问外部类 data1 和 data2 的时候,编译报错了,这是为什么呢? 因为 data1 和 data2 是属于外部类的,不是静态的,而所有静态的都不依赖于对象,如果要访问,必须得用对象得引用才能够访问到。


我们再来想下,如何在外部类中访问内部类的成员变量和自己的成员变量?
在这里插入图片描述
从上图种可以看出,要想访问 data4 和 data5 ,就必须创建对象,用对象的引用才能访问,data5 是静态的,可以直接通过类名访问!


总结:

  • 在静态内部类当中,不能直接访问外部类当中的非静态成员,如果想访问,必须实例外部类,然后通过对象的引用来访问
  • 创建静态内部类对象时,不需要先创建外部类对象

2.1.2 非静态内部类

所谓非静态内部类,就是未被static修饰的成员内部类。

class OuterClass{

	 class InnerClass{

	}
}

那么我们如何来实例非静态内部类呢?

public class Test {
    OuterClass outerClass = new OuterClass();
    OuterClass.InnerClass innerClass = outerClass.new InnerClass();
}

可以看出我们实例内部类之前,需要得到外部类的对象,才能够创建实例内部类


那么在非静态内部类中,如何访问自己的成员变量和外部类的成员变量呢?
在这里插入图片描述
可以看出外部类中的任何成员都可以在实例内部类方法中直接访问


在外部类中,又如何访问外部类成员变量和内部类成员变量呢?
在这里插入图片描述
可以看出来,需要先创建 内部类对象,通过引用才能访问 data4 和 data5. 而通过类名就可以访问 data6.


我们再来思考一个问题,当 外部类和内部类 出现同名变量时,应该是访问哪个,答案肯定是就近原则!
在这里插入图片描述
在非静态内部类中,包含了两个this,一个是外部类的 this,一个是非静态内部类的 this
在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问


2.1.3 局部内部类

定义在外部类的方法中!

在这里插入图片描述

  • 局部内部类只能在所定义的方法体内部使用
  • 不能被public、static等修饰符修饰
  • 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
  • 几乎不会使用

2.1.4 匿名内部类

在这里插入图片描述
那么上面就定义了一个匿名的内部类,那么如何调用呢?

在这里插入图片描述
通过直接 .fuc() 就能够调用

3. 结尾

以上就是介绍了! 如果有不了解,或者错误的地方,请批评指正!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个想打拳的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值