Java 成员内部类 静态内部类 局部内部类 匿名内部类

一.成员内部类:与外部类的成员变量、成员方法同级别。


public class Outer {

    private int age = 11;

    public void out(){
        System.out.println("外部类");
    }

    //内部类
    public class Inner{

        public void in(){
            System.out.println("内部类");
        }

		/**
		*内部类可以直接访问外部类的私有成员,而且不会破坏封装。
		*/
        public void getOut(){
            System.out.println(age); //获得外部类的私有属性
            out();//获得外部类的方法
        }
    }


}

main方法:


public class Test {

    public static void main(String[] args) {

        Outer outer = new Outer();//实例化外部类

        Outer.Inner inner = outer.new Inner();//通过外部类实例化内部类
		
		//也可以一行代码实例化两个类
		//Outer.Inner inner = new Outer().new Inner();
		
        //执行内部类的方法
        inner.in();
        inner.getOut();

    }

}

结果:
在这里插入图片描述
注意:当外部类和内部类存在重名属性时,会优先访问内部类属性。
实例:


public class Outer {

    public int age = 11;

    public class Inner{

        /**
         * 注意:成员内部类不能定义静态成员,但可以定义静态常量成员。
         */
        public static final int age = 22;//正确
        //public static int age = 22;//错误

        public void out(){

            System.out.println(age);//默认访问内部类的属性

            System.out.println(Outer.this.age);//访问外部类的属性

        }

    }
}

main方法:


public class TestOuter {

    public static void main(String[] args) {

        Outer outer = new Outer();

        Outer.Inner inner = outer.new Inner();

        inner.out();//调用内部类的方法

    }
}

结果:
在这里插入图片描述
二.静态内部类:与外部类同级别。不依赖外部类对象,可直接创建或通过类名访问,可定义静态成员。

实例:


public class Outer {

    public int age = 11;

    public static class Inner{

        public static int age = 22;

        public void out(){

            System.out.println(Inner.age);//静态内部类可以通过类名访问内部类属性
            System.out.println(age);//内部类属性

            //因为静态内部类与外部类同级别,所以访问外部类时就当一个普通类来访问。
            Outer outer = new Outer();
            System.out.println(outer.age);//外部类属性

        }

    }
}

main方法:


public class TestOuter {

    public static void main(String[] args) {

        //不用创建外部类对象,因为静态内部类和外部类同级别。
        Outer.Inner inner = new Outer.Inner();
        inner.out();
    }
}

结果:
在这里插入图片描述
注意:只用内部类才能使用static关键字修饰,普通类不能。

三.局部内部类:定义在外部类的方法中,作用范围和创建对象范围仅限于当前方法。

实例:


public class Outer {

    private int age1 = 11;

    public void show1(){

        int age2 = 22;

        //局部内部类前面不能加任何访问修饰符:如public/private等
        class Inner{

            private int age3 = 33;

            public void show2(){
                System.out.println(age1);//11
                System.out.println(age2);//22
                System.out.println(age3);//33

            }
        }

        //使用show1方法中的局部内部类
        Inner inner = new Inner();
        inner.show2();
    }
}

main方法:


public class TestOuter {

    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show1();
    }
}

结果:
在这里插入图片描述
四:匿名内部类:没有类名的局部内部类(一切特征都与局部内部类相同)。必须继承一个父类或者实现一个接口。

实例:使用普通方法和局部内部类的方法完成。

定义一个接口:


public interface Usb {
    void service();
}

实现接口:


public class Mouse implements Usb{
    @Override
    public void service() {
        System.out.println("Connected to computer successfully");
    }
}

main方法:


public class TestUsb {

    public static void main(String[] args) {

        /**
         * 第一种方法:创建接口类型的变量
         */
        /*Usb usb = new Mouse();
        usb.service();*/


        /**
         * 第二种方法:使用局部内部类
         */
        class Test implements Usb{

            @Override
            public void service() {
                System.out.println("Connected to computer successfully");
            }
        }
        Usb usb = new Test();
        usb.service();
    }

}

以上两种方法的测试结果相同,如下:
在这里插入图片描述
接下来使用匿名内部类进行优化:

实例:


public class TestUsb {

    public static void main(String[] args) {

        /**
         * 第三种方法:使用匿名内部类(相当于创建了一个局部内部类)
         */
        Usb usb = new Usb() {
            @Override
            public void service() {
                System.out.println("Connected to computer successfully");
            }
        };
        usb.service();
    }

}

使用匿名内部类的优缺点:
优点:减少代码量。
缺点:可读性较差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值