文章目录
文章目录
前言
本次任务的学习目标是内部类的学习,这个内容有点烧脑,尽量尽自己的努力去熟悉就好,这是我对自己的一个小任务,由于内部类在以后的项目开发中出现的比较少(但是不排除有些倒霉蛋开发者遇到的次数较多),我就没有做太多的解释了。
话不多说开始干!!
一、内部类是什么?
首先,当我们看到“内部类”这个名字的时候我们就应该想到一些关于它的特点了吧,顾名思义,内部类,存在于类的内部的类,那么它究竟是何方神圣,又有什么用呢?以及它的触发机制和用处。
示例图如下
(1)走进内部类
概念:在一个类的内部所定义的类称为内部类。内部类允许把一些逻辑相关的类组织在一起,并且控制内部类的可视性。
(2)内部类的分类
内部类分为两类:
1、成员内部类:A、实例内部类 B、静态内部类
2、局部内部类:匿名内部类(最麻烦的就是这个东西)
3、静态内部类
4、匿名内部类
提醒:成员内部类的访问修饰符跟成员变量是一样的,可以是默认(default),private,protected,public
1、内部类的特点
1、编译后可以生成独立的字节码文件
2、内部类可直接访问外部类的私有成员,而不破坏封装
2、可为外部类提供必要的内部功能组件
(3)使用内部类
1、创建一个内部类
//外部类
public class Outter {
private String str1 = "aaa";
String str2 = "bbb";
protected String str3 = "ccc";
public String str4 = "ddd";
final String str5 = "eee";
static String str6 = "fff";
//成员内部类
class Inner{
private String str1 = "成员内部里的属性~~~";
public void method(){
System.out.println("成员内部类里的方法");
System.out.println(this.str1);
System.out.println(Outter.this.str1);//调用外部类的属性
System.out.println(str2);//Outter.this.str2
System.out.println(str3);//Outter.this.str3
System.out.println(str4);//Outter.this.str4
System.out.println(str5);//Outter.this.str5
System.out.println(str6);//Outter.str6
}
}
}
public class Test01 {
public static void main(String[] args) {
/**
* 知识点:内部类
* 含义:一个类里面声明一个类
*
* 分类:
* 1.成员内部类
* 特点:可以调用外部类中所有的属性
* 2.静态内部类
* 3.接口内部类
* 4.局部内部类
* 5.匿名内部类
*/
//创建成员内部类对象
Inner inner = new Outter().new Inner();
//调用方法
inner.method();
}
}
2、案例演示(尽量了解,说不定以后会有面试呢)
public class Outer{
public class InnerTool{
public int add(int a, int b){
return a+b;
}
}
private InnerTool inner =new InnerTool();
public int add(int a,int b){
return inner.add(a,b);
}
public static void main(String[] args){
//通过外部类计算结果
Outer out=new Outer();
System.out.println(outer.add(1,7));
//通过内部类的计算结果,此处实例化内部类比较麻烦也比较难以理解,需要多多练习
Outer.InnerTool inner=new Outer().new InnerTool();
//另一种写法
Outer.InnerTool inner2=new Outer().new InnerTool();
System.out.println(inner2.add(1,7));
}
}
成员内部类-静态内部类
//创建静态内部类的实例,无序创建外部类的实例,详见案例
//要注意下面创建静态内部类实例的方式
public static Outer4{
public static class Inner4{
int a=1;
}
public static void main(String[] args){
Outer4.Inner4 inner =new Outer4.Inner4();
System.out.print(inner.a);
}
}
//注意:静态内部类是可以直接访问到外部类的非静态成员变量
(4)匿名内部类的解读
1、什么是匿名内部类
没有类名的局部内部类(一切特征都与局部内部类相同)
必须继承一个父类或者实现一个接口
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
2、匿名内部类的优缺点
优点:减少代码量
确定:可读性较差
(5)局部内部类的解读
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
限制类的适用范围
(6)静态内部类的解读
不依赖外部类对象,可以直接创建或通过类名访问,可声明静态成员
只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
Outer.Inner inner=new Outer.Inner();
Outer.Inner.show();
(7)成员内部类
在类的内部定义,与实例变量、实例方法同级别的类
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
Outer out =new Outer();
Outer.Inner in=out.new Inner();
当外部类、内部类存在重名属性时,会邮箱访问内部类的属性
成员内部类不能定义静态成员
(5)内部类的运行内存实况:
对于每一个内部类来说。java编译器都会为其生成独立的类文件(.class),即在JVM内存空间中有对应的开辟控件与之对应,其次内部类在被访问的时候是不会破坏掉封装下的外部类的,安全性更高,但复杂度也很高。
总结
今天的内容比较复杂,但是最好只作为一个了解就好,其实内部类总共分七种,而我只列举了两种比较常见的,也是可能会被使用到的,所以今天就到这里吧。本部分内容属于常用类模块的一部分,等下一次我将把剩下的比较重要的内容发布出来。