javaSe中内部类的分类以及使用--成员内部类、静态内部类、局部内部类、匿名内部类

成员内部类

概念
在类的内部定义,与实例变量、实例方法同级别的类
注意
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象 Outer out = new Outer; Outer.Inner in = out.new Inner();
特点
成员内部类可以使用任意访问修饰符
成员内部类可以直接访问外部类的属性和方法
成员内部类中属性和外部类的属性同名时,使用外部类名.this来访问外部类的属性
成员内部类不能包含静态成员,但是可以包含静态常量

public class Outer {
    private int age = 18;
    private String name = "张三";
    public void show(){
        System.out.println("外部类的属性:"+age + name);
    }
    class Inner{
        private int age = 20;
        private String name ="李四";
        public void show(){
            System.out.println("内部类的属性"+ age +name);
            //内部类调用外部类的属性
            System.out.println("内部类调用外部类的属性"+ Outer.this.age +Outer.this.name);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Outer out = new Outer();
        Outer.Inner in = out.new Inner();
        //上面两步代码可以合成一个
        //Outer.Inner in = new Outer().new Inner()
        in.show();
        out.show();
    }
}

静态内部类

概念:
依赖外部类对象,可直接创建或通过类访问,相当于外部类,为外部类提供功能
注意:
只能直接访问外部类的静态成员
特点:
静态外部类可以使用任意修饰符
静态内部类不能直接访问外部类的实例属性和方法,可以直接访问静态的属性和方法
静态内部类可以包含静态成员

public class Outer {
    private static int age = 18;
    private static String name = "张三";
    public void show(){
        System.out.println("外部类的属性:"+age + name);
    }
    static class Inner{
        private int age = 20;
        private String name ="李四";
        public void show(){
            System.out.println("内部类的属性"+ age +name);
            //内部类调用外部类的属性
            System.out.println("内部类调用外部类的属性"+ Outer.age + Outer.name );
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Outer.Inner in = new Outer.Inner();
        Outer out = new Outer();
        //上面两步代码可以合成一个
        //Outer.Inner in = new Outer().new Inner()
        in.show();
        out.show();
    }
}

局部内部类

概念:
定义在外部方法中,作用范围和创建对象范围仅限于当前方法,限制类的适用范围
特点:
①不能使用任何访问修饰符
②如果局部类所在的方法是实例方法,可以直接访问外部类的实例属性和方法;如果局部类所在的方法是静态方法,只能访问外部类的静态属性和方法
③局部类可以访问局部变量,但是局部变量必须是final,JDK1.8.final可以省略,对象生命周期长于局部变量
④局部内部类中不能声明静态成员,可以使用静态常量

public class Outer {
    private String name = "王五";
    private int age = 25;
    public void show(){
        final int num = 1000;
        class Inner{
            private String phone = "110";
            public void saiHi(){
                System.out.println("电话:" + phone);
                System.out.println("姓名:" + Outer.this.name + " 年龄:" + Outer.this.age);
                System.out.println("num" + 1000);
            }
        }
        Inner inner = new Inner();
        inner.saiHi();
    }
}
public class Test {
    public static void main(String[] args) {
        Outer out = new Outer();
        out.show();
    }
}

匿名内部类

概念:
相当于没有类名的局部内部类,必须继承父类或者实现接口
优点:
减少代码量,缺点:可读性比较差
在这里插入图片描述

//定义一个接口
public interface Usb {
    public abstract  void service();
}
//接口的实现类
public class Upan implements Usb {
    @Override
    public void service() {
        System.out.println("与电脑连接成功");
    }
}
//测试
public class Test {
    public static void main(String[] args) {
 //局部内部类的写法
//      Upan upan = new Upan();
//      upan.service();

//        class Mouse implements Usb{
//            @Override
//            public void service() {
//                System.out.println("鼠标和电脑连接成功");
//            }
//        }
//匿名内部类的使用
        Usb mouse = new Usb(){
            @Override
            public void service() {
                System.out.println("鼠标和电脑连接成功,开始工作。。。");
            }
        };
        mouse.service();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值