Java:就是要让你学会内部类,java 面试知识点
代码优化:它需要更少的代码
分类
--
内部类可以分为:
静态内部类。
非静态内部类。
非静态内部类又可以分为:
成员内部类。
方法内部类。
匿名内部类。
静态内部类
我感觉这个是用的最多的,你比如说 Redis 的 key 的设计, 因为我们要中间拼接:号,所以用静态内部类去组成不同的 key 是非常好的,这样可以让相同类型的 key 在同一个文件目录下

静态内部类的定义和普通的静态变量或者静态方法的定义方法是一样的,使用 static 关键字,只不过这次 static 是修饰在 class 上的,一般而言,只有静态内部类才允许使用 static 关键字修饰,普通类的定义是不能用 static 关键字修饰的,这一点需要注意一下。
《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
下面定义一个静态内部类:
public?class?Out?{
private?static?String?name;
private?int?age;
public?static?class?In{
private?int?age;
public?void?sayHello(){
System.out.println("my?name?is?:?"+name);
//--编译报错---
//System.out.println("my?age?is?:"+?age);
}
}
}
在上述代码中,In 这个类就是一个静态内部类。我们说内部类是可以访问外部类的私有字段和私有方法的,对于静态内部类,它遵循一致的原则,只能访问外部类的静态成员。
上述代码中,外部类的非静态私有字段 age 在静态内部类中是不允许访问的,而静态字段 name 则是可访问的。下面我们看,如何创建一个静态内部类的实例对象。
public?static?void?main(String?[]?args){
Out.In?innerClass?=?new?Out.In();
innerClass.sayHello();
}
使用场景,一般来说,对于和外部类联系紧密但是并不依赖于外部类实例的情况下,可以考虑定义成静态内部类。下面我们看稍显复杂的成员内部类。
成员内部类
我们说了,四种不同类型的内部类都各自有各自的使用场景,静态内部类适合于那种和外部类关系密切但是并不依赖外部类实例的情况。但是对于需要和外部类实例相关联的情况下,可以选择将内部类定义成成员内部类。
以下代码定义了一个简单的成员内部类:
public?class?Out?{
private?String?name;
public?void?showName(){
System.out.println("my?name?is?:?"+name);
}
public?class?In{
public?void?sayHello(){
System.out.println(name);
Out.this.showName();
}
}
}
以上定义了一个简单的内部类 In,我们的成员内部类可以直接访问外部类的成员字段和成员方法,因为它是关联着一个外部类实例的。下面我们看看在外部是如何创建该内部类实例的。
public?static?void?main(String?[]?args){
Out?out?=?new?Out();
out.setName("六脉神剑")
Out.In?in?=?out.new?In();
in.sayHello();
}
因为成员内部类是关联着一个具体的外部类实例的,所以它的实例创建必然是由外部类实例来创建的。
对于实例的创建,我们只需要记住即可,成员内部类的实例创建需要关联外部类实例对象,静态内部类实例创建相对简单。下面我们主要看看在编译阶段编译器是如何保持内部类对外部类成员信息可访问的。
使用场景,对于那种要高度依赖外部类实例的情况下,定义一个成员内部类则会显的更加明智。
方法内部类
方法内部类,顾名思义,定义在一个方法内部的类。方法内部类相对而言要复杂一些,下面定义一个方法内部类:
public?class?Out?{
private?String?name;
public?void?sayHello(){
class?In{
public?void?showName(){
System.out.println("my?name?is?:?"+name);
}
}
In?in?=?new?In();
in.showName();
}
}
我们定义了一个类,在该类中又定义了一个方法 sayHello,然而在该方法中我们定义了一个内部类,类 In 就是一个方法内部类。**我们的方法内部类的生命周期不超过包含它的方法的生命周期,也就是说,方法内部类只能在方法中使用。**所以在声明的时候,任何的访问修饰符都是没有意义的,于是 Java 干脆不允许使用任何的访问修饰符修饰方法内部类。
其中还需要注意一点的是,**定义和使用时两回事,别看那一大串定义类的代码,你实际想要使用该类,就必须 new 对象,而对于方法内部类而言,只能在方法内部 new 对象。**这就是方法内部类的简单介绍,下面我们看看其实现原理。
有关方法内部类的实现原理其实是和成员内部类差不太多的,也是在内部类初始化的时候为其传入一个外部类实例,区别在哪呢?就在于方法内部类是定义在具体方法的内部的,所以该类除了可以通过传入的外部实例访问外部类中的字段和方法,对于包含它的方法中被传入的参数也会随着外部类实例一起初始化给内部类。
毋庸置疑的是,方法内部类的封装性比之前介绍的两种都要完善。所以一般只有在需要高度封装的时候才会将类定义成方法内部类。
匿名内部类
可能内部类的所有分类中,匿名内部类的名号是最大的,也是我们最常用到的,多见于函数式编程,lambda 表达式等。下面我们重点看看这个匿名内部类。
总结
至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:
技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
项目经历:只写明星项目,描述遵循 STAR 法则;
简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;
以及最后为大家准备的福利时间:简历模板+Java 面试题+热门技术系列教程视频



评论