Java 内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

概念

如果一个类定义在另一个类的内部,这个类就是内部类,当一个类的内部,包含一个完整的事物,且这个事物没有必要单独设计,就可以把这个事物设计成内部类。

内部类的四种形式

成员内部类

就是类中的一个普通成员

Outer.Inner in = new Outer().new Inner(); // 先把外部类new出来才能new内部类
public class Outer {//外部类
    private int age = 99;
    public static String a;
    public class Inner{//内部类
        private String name;
        private int age = 88;
        public static String school;//jdk 16才开始支持定义静态
       public void test(){
           System.out.println(age);//访问当前内部类所在的外部类成员
           System.out.println(a);

           int age = 66;
           System.out.println(age);
           System.out.println(this.age);//访问当前内部类所在的外部类成员
           System.out.println(Outer.this.age);//通过外部类.this 拿取外部类对象变量信息

       }
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

静态内部类

Outer.Inner in = new Outer.Inner();
public class Outer {
    private int age;
    public static String school;
    public static class Inner{
        // 静态内部类
        private String name;
        public static int a;
        public void test(){
            System.out.println(school);//可以直接访问外部类的静态成员
            //不能直接访问外部类的实例对象,System.out.println(age);

        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

有static修饰 的内部类,属于外部类自己独有

内部类可以访问外部类的静态成员变量可以访问,但不能访问实例成员

局部内部类

局部内部类定义在方法中,代码块中,构造器等执行器中

public class OuterClass {  
    public void someMethod() {  
        final int outerVariable = 10; // 可以被局部内部类访问的外部变量  
  
        class LocalInnerClass {  
            void print() {  
                System.out.println("Local inner class accessing outer variable: " + outerVariable);  
            }  
        }  
  
        LocalInnerClass localInner = new LocalInnerClass();  
        localInner.print(); // 输出:Local inner class accessing outer variable: 10  
    }  
  
    public static void main(String[] args) {  
        OuterClass outer = new OuterClass();  
        outer.someMethod(); // 调用包含局部内部类定义的方法  
    }  
}

匿名内部类(重点)

使用时需被动去用,核心是简化代码,就是一种特殊的局部内部类,所谓匿名就是程序员不需要为这个类声明名字

public class Test {
    public static void main(String[] args) {
        // 1.把这个匿名内部类编译成一个子类,然后立即创建一个子类对象出来。
        Animal a = new Animal(){
            public void cry(){
                System.out.println("喵喵喵~~");
            }
        };
        a.cry();
    }
}

abstract class Animal{
    public abstract void cry();

匿名内部类在开发中应用场景,通常作为一个参数传输给方法

匿名内部类的书写格式

new 类或接口(参数值){
类体}

 Animal a = new Animal(){//new对象
            public void cry(){//重写方法
                System.out.println("喵喵喵~~");
            }
        };
        a.cry();
    }
}



Swimming A =  new Swimming(){//new接口
            @Override
            public void swim() {
                System.out.println("狗游泳不错");

            }
        };
       go(A);
interface Swimming{
    void swim();
}
设计一个方法,可以接收Swimming接口的一切实现类对象进来参加游泳比赛
go(new Swimming(){
            @Override
            public void swim() {
                System.out.println("狗游泳不错");

            }
        });


public static  void go(Swimming s){//声明一个对象s获取接口所有方法
    System.out.println("开始————————————————");
    s.swim();
}
}

匿名内部类的特点

匿名内部类本质是一个子类,并会立即创建出一个子类对象

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值