Java之内部类

内部类

常用类总体学习目标

  1. 内部类
  2. Object类
  3. Object类常用方法
  4. 包装类
  5. String类
  6. BigDecimal类

内部类

分类

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

概念

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

特点:

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

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

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

成员内部类

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

  • 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象

    • Outer out = new Outer();
    • Inner in = out .new Inner();
  • 当外部类、内部类 存在重名属性时,会优先访问内部类属性

  • 成员内部类不能定义静态成员(可以包含静态成量)

  • package com.kind.chapter_1;
    //头部
    public class Body {
    //    身体
        private String name;
            class  Header{
                public void show(){
                    System.out.println(name);
                }
            }
        }
    
  • package com.kind.chapter_1;
    //外部类
    public class Outer {
    //    实例变量
        private String name = "张三";
        private int age = 20;
    
    //    内部类
        class Inner{
            private String address ="北京";
            private String phone   ="110";
    //   属性和外部类的属性相同  如果想访问外部类  外部类名字.+this.+属性
            private String name = "李四";
    
            private static final String country = "中国";
    
    //        方法
        public void show(){
    //        打印外部类的属性
            System.out.println(Outer.this.name);
            System.out.println(age);
    //        打印内部类的属性
            System.out.println(address);
            System.out.println(phone);
        }
    
    
        }
    
    }
    
  • package com.kind.chapter_1;
    
    public class TestOuter {
        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();
    
        }
    }
    

静态内部类

  • 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
  • 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
        Outer.Inner inner = new Outer.Inner();
        inner.show();
  • 关键词static 只有静态内部类才能使用 一般类不使用

局部内部类

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

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

  • 限制类的使用范围:只能在当前的方法中使用

  • public class Outer {
        private String name = "成龙";
        private int age = 18;
    
        public void show(){
    //        定义局部变量
            String address = "深圳";
    //        局部内部类: 注意不能加任何访问修饰符
            class Inner{
                private String phone= "123456789";
                private String email= "chenglong@qq.com";
    //            不能有静态   但是可以加final 变成静态常量(特殊)
    //            private  final static int count= 2000;
    
                private void show2(){
    //           访问外部类的属性
                    System.out.println(name);
                    System.out.println(age);
    //非静态可以访问  要是变成静态属性  就要new对象访问
    
    //                访问内部类
                    System.out.println(phone);
                    System.out.println(email);
    //             访问局部变量 :JDK 1.7 要求变量必须是常量 final  1.8之后 会自动添加final
                    System.out.println(address);
                }
            }
    //        创建局部类对象
            Inner inner = new Inner();
            inner.show2();
        }
    }
    
  • package com.kind.chapter_3;
    
    public class TestOuter {
        public static void main(String[] args) {
            Outer outer = new Outer();
            outer.show();
    
        }
    }
    

匿名内部类

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

  • 必须继承一个父类或者实现一个接口

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

  • 优点:减少代码量

  • 确定:可读性较差

  • package com.kind.chapter_4;
    
    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();
        }
    }
    
  • package com.kind.chapter_4;
    //接口
    public interface Usb {
    //    服务
        void service();
    
    }
    
  • package com.kind.chapter_4;
    
    public class Mouse  implements Usb{
        @Override
        public void service() {
            System.out.println("连接电脑成功,鼠标开始工作了");
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值