通过学习本篇文章可以掌握如下知识
成员内部类
静态内部类
局部内部类
匿名内部类(重点掌握)
内部类
是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),其定义为:如果一个类定义在另一个类的内部,这个类就是内部类。
场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计为内部类。
例如:汽车中的发动机。
成员内部类
成员内部类就是类中的一个普通成员,类似之前学过的成员变量。
虽然成员内部类充当的时成员变量的成分,但是其本质还是一个类,因此类有的东西,它都有。
public class Outer {
private static String A = "AAA";
public class Inner {
private String name;
// 无参构造器
public Inner() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void test() {
System.out.println("这是成员内部类的普通方法;");
System.out.println(A);
}
}
}
由于内部类定义的是普通内部类,因此不能定义静态成员与静态方法,但是可以访问外部的静态变量
在JDK16时候进行改变,支持静态变量的定义
那么如何访问呢?
之前访问成员变量需要实例.成员变量,但是这个变量也是一个类,因此需要new,于是就有如下:
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner in = outer.new Inner();
in.test();
}
}
总结
静态内部类
有static修饰的内部类,属于外部类自己持有的,注意和内部类的区别。
代码实现
package cn.msf.baseJava.d_9_innerClass;
public class Outer2 {
// 静态内部类
public static class Inner2{
private String name;
public static int a;
public Inner2(String name) {
this.name = name;
}
public Inner2() {
}
public void test(){
System.out.println("静态内部类的普通方法");
}
public static void test(int a){
System.out.println("静态内部类的静态方法");
}
}
}
测试
public class Test {
public static void main(String[] args) {
Outer2.Inner2 inner2 = new Outer2.Inner2();
inner2.test();
Outer2.Inner2.test(2);
}
}
打印结果
总结
局部内部类
局部内部类定义在方法中、代码块中、构造器等执行体中,属于鸡肋语法。
匿名内部类【重点】
是一种特殊的内部类,所谓匿名,即程序员不需要为这个类声明名字。
代码实现。以猫狗为案例讲解匿名内部类。
package cn.msf.baseJava.d_9_innerClass;
public class Test {
public static void main(String[] args) {
Animal a = new Cat();
a.cry();
// 如果想建立一个狗子呢?但是有不想声明类。
// 这就是匿名内部类。
Animal d = new Animal() {
@Override
public void cry() {
System.out.println("我是狗子,U•ェ•*U");
}
};
d.cry();
}
}
abstract class Animal {
public abstract void cry();
}
class Cat extends Animal {
@Override
public void cry() {
System.out.println("猫喵喵喵的叫,o(=•ェ•=)m");
}
}
结果展示
不用将它作为一个高大上的东西,其本质还是一个类,然后创建对象接收而已。
总结
希望多多点赞收藏关注,如果有问题的地方,欢迎在评论区讨论!