内部类的概念及分类
- 内部类就是在类的内部定义的类。叫做内部类
- 分为实例内部类,静态内部类,局部内部类,匿名内部类
实例内部类的定义及访问
- 实例内部类当中可以定义静态的,也可以定义实例的
- 在实例内部类当中的实例方法中可以访问外部类所有的属性
- 在实例内部类中的静态方法中不能直接访问外部类实例相关的数据
public class OuterClass {
static int a = 100;
int b = 200;
class InnerClass {
public void m1(){
System.out.println("m1方法执行了");
System.out.println(a);
System.out.println(b);
}
public static void m2(){
System.out.println("m2方法执行了");
System.out.println(a);
}
}
}
public class Test {
public static void main(String[] args) {
OuterClass oc = new OuterClass();
OuterClass.InnerClass innerClass = oc.new InnerClass();
innerClass.m1();
OuterClass.InnerClass.m2();
}
}
静态内部类的定义及访问
- 在静态内部类当中无法访问外部类的所有的实例相关的数据
public class OuterClass {
static int a = 100;
int b = 200;
protected static class InnerClass {
public void m1(){
System.out.println("m1...");
System.out.println(a);
}
public static void m2(){
System.out.println("m2...");
System.out.println(a);
}
}
}
public class Test {
public static void main(String[] args) {
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
innerClass.m1();
OuterClass.InnerClass.m2();
}
}
静态内部类的定义及访问
- 局部内部类就是局部变量。只在当前方法中有效。局部变量不能使用private等修饰符修饰。局部内部类同样也不能使用private等修饰符修饰。
OuterClass.java
public class OuterClass {
static int a = 100;
int b = 200;
public void m(){
int i = 100;
class InnerClass {
public void m1(){
System.out.println("m1....");
System.out.println(a);
System.out.println(b);
System.out.println(i);
}
public static void m2(){
System.out.println("m2....");
System.out.println(a);
}
}
InnerClass innerClass = new InnerClass();
innerClass.m1();
InnerClass.m2();
}
}
public class Test {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.m();
}
}
匿名内部类的定义及访问
public class AnonymousInnerClass {
public static void main(String[] args) {
SystemService systemService = new SystemService();
systemService.exit(new UserService(){
public void logout(){
System.out.println("用户退出!");
}
});
systemService.exit(()->{
System.out.println("用户退出!");
});
systemService.exit(()->{
System.out.println("用户退出!");
});
systemService.exit(() -> System.out.println("用户退出!") );
}
}
class SystemService {
public void exit(UserService userService){
userService.logout();
System.out.println("系统已经安全退出!");
}
}
@FunctionalInterface
interface UserService {
void logout();
}
内部类回调外部类
public interface Tool {
int calculate(int a, int b);
}
public class Robot {
public int calculate(int a, int b){
return a + b;
}
public int multiply(int a, int b){
return a * b;
}
class InnerClass implements Tool {
@Override
public int calculate(int a, int b) {
return multiply(a , b);
}
}
public Tool getTool(){
return new InnerClass();
}
}
public class Test {
public static void main(String[] args) {
Robot robot = new Robot();
System.out.println(robot.calculate(10, 20));
Tool tool = robot.getTool();
System.out.println(tool.calculate(10, 20));
}
}