参考链接:
https://blog.csdn.net/qq_45821255/article/details/121425514
https://blog.csdn.net/weixin_46972127/article/details/123609366
一.内部枚举
1.定义
/**
* @author wangtw
* @ClassName OutSide
* @description: 内部类测试
* @date 2023/1/2010:41
*/
public abstract class Outside {
private Integer age = 18;
static String staticValue = "外部类静态域";
/**
* 内部枚举
*/
public enum OutsideEnum {
ONE("one", "1"),
TWO("two", "2"),
;
final String label;
final String value;
/**
* 定义全参构造方法
* @param label
* @param value
*/
OutsideEnum(String label, String value) {
this.label = label;
this.value = value;
}
/**
* get方法
* @return
*/
public String getLabel() {
return label;
}
public String getValue() {
return value;
}
}
}
2.使用
// 内部枚举测试
System.out.printf("内部枚举测试:%s", Outside.OutsideEnum.ONE.getValue());
二.匿名内部类
/**
* @author wangtw
* @ClassName OutSide
* @description: 内部类测试
* @date 2023/1/2010:41
*/
public abstract class Outside {
private Integer age = 18;
static String staticValue = "外部类静态域";
/**
* 抽象方法
*/
public abstract void testInnerClass();
}
@SpringBootTest
public class InnerClassTest {
private Integer aaa = 323;
@Test
public void innerClassTest() {
// 匿名内部类测试
Outside outside = new Outside() {
private Integer aaa = 444;
// 匿名内部类
@Override
public void testInnerClass() {
System.out.println(aaa);
System.out.println(InnerClassTest.this.aaa);
System.out.println("匿名内部类");
}
};
outside.testInnerClass();
}
}
注:
(1)必须继承 一个抽象类或实现一个借口;
(2)经常作为参数或返回值;
(3)可以直接访问外部类的所有成员;
(4)若外部类的成员变量和匿名内部类的成员变量重名,遵循就近原则;
(5)匿名内部类对象是一个成员变量 ;
三.成员内部类
1.定义
package com.xiaobai.inner_class;
/**
* @author wangtw
* @ClassName OutSide
* @description: 内部类测试
* @date 2023/1/2010:41
*/
public abstract class Outside {
private Integer age = 18;
static String staticValue = "外部类静态域";
/**
* 成员内部类
*/
public class Inner {
private String msg = "Hello World";
private Integer age = 20;
public String getMsg() {
return msg;
}
public void innerTest() {
System.out.printf("内部类msg:%s", msg);
System.out.println();
System.out.printf("外部类age:%s", Outside.this.age);
System.out.println();
System.out.printf("内部类age:%s", this.age);
}
}
/**
* 抽象方法
*/
public abstract void testInnerClass();
}
2.使用
// 成员内部类测试
Outside.Inner inner = new Outside() {
@Override
public void testInnerClass() {
}
}.new Inner();
inner.innerTest();
注:
(1)成员内部类可以直接访问外部类的静态变量;
四.静态内部类
1.定义
package com.xiaobai.inner_class;
/**
* @author wangtw
* @ClassName OutSide
* @description: 内部类测试
* @date 2023/1/2010:41
*/
public abstract class Outside {
private Integer age = 18;
static String staticValue = "外部类静态域";
/**
* 静态内部类
*/
public static class StaticInner {
private String msg = "静态内部类";
public void staticInnerTest() {
System.out.printf("静态内部类msg:%s, 外部类静态成员变量值:%s", msg, staticValue);
}
}
}
2.使用
// 静态内部类
Outside.StaticInner staticInner = new Outside.StaticInner();
staticInner.staticInnerTest();
注:
(1)静态内部类可以访问外部类的静态变量;
(2)静态内部类不能访问外部类的非静态变量;