java内部类

内部类的定义

在一个类的内部再定义一个完整的类

特点

编译后可以生成独立的字节码文件

内部类可以访问外部类的私有成员,而不破坏封装性

可为外部类提供必要的内部功能组件

成员内部类

  1. 在内部类定义,与实例变量,实例方法同级别的类

  2. 外部类的一个实例部分,创建内部类对象时必需依赖外部类对象

    
    package com.chapter.Demo02;
    //外部类
    public class Outer {
        //实例变量
        private String name = "张三";
        private int age=20;
        //内部类
        class Inner{
            private String address ="北京";
            //内部类属性与外部类属性名字相同;Outer.this
            private String name = "110";
            //方法
            public void show(){
                //打印外部类的属性,,内部类属性与外部类属性名字相同;Outer.this
                System.out.println(Outer.this.name);
                System.out.println(Outer.this.age);
                //打印内部类中的属性
                System.out.println(this.address);
                System.out.println(this.name);
    
            }
        }
    }
    
    
    public class TestOut {
        public static void main(String[] args) {
            //创建一个外部类对象
            Outer outer = new Outer();
            //创建内部类对象
            Outer.Inner inner = outer.new Inner();
            //一步到位
            Outer.Inner inner = new Outer().new Inner();
            inner.show();
        }
    }
    
    
  3. 当外部类,内部类存在重名的属性时,会优先访问内部类属性。

  4. 成员内部类不定义静态成员,但可以定义静态常量。

静态内部类

  1. 不依赖外部类对象,可以直接创建或通过类名访问,可以声明静态成员

  2. package com.chapter.Demo03;
    
    import com.sun.jmx.snmp.SnmpUnknownAccContrModelException;
    
    //外部类
    public class Outer {
        private String name="xu";
        private int age = 18;
        //静态内部类,级别与外部类相同
        static class Inner{
            private String address = "合肥";
            private String phone = "111";
            //可以包含静态成员
            private static int count = 100;
            public void show(){
                //如何调用外部类属性
                //1.先创建外部类对象
                Outer outer = new Outer();
                //2.调用外部类对象的属性
                System.out.println(outer.name);
                System.out.println(outer.age);
                //调用静态内部类的属性
                System.out.println(address);
                System.out.println(phone);
                //调用静态内部类的静态属性
                System.out.println(Inner.count);
            }
        }
    }
    
    
package com.chapter.Demo03;

public class TestOuter {
    public static void main(String[] args) {
        //直接创建静态内部类对象
        Outer.Inner inner = new Outer.Inner();
        //调用方法
        inner.show();
    }
}

局部内部类

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

  2. package com.chapter.Demo04;
    
    public class Outer {
        private String name="xu";
        private int age =22;
        public void show(){
            //定义局部变量
             String address ="上饶";
            //局部内部类;注意不能加任何访问修饰符
            //局部内部类与局部变量级别相同
            class Inner{
                //局部内部类属性
                private String phone ="1234";
                private String email ="0987";
                public void show2(){
                    //访问外部类的属性
                    System.out.println(Outer.this.name);
                    System.out.println(Outer.this.age);
                    //访问内部类属性
                    System.out.println(this.email);
                    System.out.println(this.phone);
                    //如何访问局部变量,jdk1.7  要求必须是常量;jdk1.8  自动添加final
                    System.out.println(address);
    
                }
    
            }
            //创建局部内部类对象
            Inner inner =new Inner();
            inner.show2();
        }
    
    }
    
    
package com.chapter.Demo04;

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

  1. 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。

  2. 限制类的使用范围。

匿名内部类

  1. 没有类名的局部内部类(一切特征都与局部内部类相同)

  2. 必须继承一个父类或者实现一个接口。

  3. 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。

  4. 优点,减少代码量

  5. 缺点,可读性较差。

  6. package com.chapter.Demo05;
    
    public interface Usb {
        //服务
        void service();
    }
    
    
package com.chapter.Demo05;

public class TestUsb {
    public static void main(String[] args) {
        //创建一个接口的变量
        /*Usb usb =new Mouse();
        usb.service();*/
        //局部内部类
//        class Fan implements Usb{
//            @Override
//            public void service() {
//                System.out.println("连接电脑成功,风扇开始工作");
//            }
//        }
//        //使用局部内部类创建对象
//        Usb usb = new Fan();
//        usb.service();
//
        //使用匿名内部类(相当于创建了一个局部内部类)
        Usb usb = new Usb() {
            @Override
            public void service() {
                System.out.println("连接电脑成功,风扇开始工作");
            }
        };
        usb.service();
    }
}


原文地址:http://www.cnblogs.com/wusan123qwe/p/16906947.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性