• Java小树的参天成长【内部类,成员内部类,静态内部类,局部内部类,匿名内部类】


    内部类分类

    内部类包括四种形式,成员内部类,静态内部类(用static修饰),局部内部类,匿名内部类

    什么是内部类

    概念:在一个类的内部再定义一个完整的类。

    Class Outer{//外部类
        class Inner{
            //内部类(也会生成class 文件)
        }
    }

    特点:1.编译之后可生成独立的字节码文件(比如上述代码会生成Outer$Inner.class   Outer.class)           2.内部类可以直接访问外部类的私有成员,而不破坏封装                                                                 3.可为外部类提供必要的功能组件

    成员内部类

    特点与用法

    1.在类的内部定义,与实例变量、实例方法同级别的类。                                                                   2.外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象(见代码)
              //创建内部类对象之前,需要创建外部类对象
              Outer outer = new Outer();
              //创建内部类对象
               Inner inner = outer.new Inner();
        
               //一步到位
               Inner inner = new Outer().new Inner();

    1. package com.mh.fdsf_1101;
    2. //外部类
    3. public class Outer {
    4. private String name="张三";
    5. private int age=30;
    6. //内部类
    7. class Inner{
    8. private String address = "北京";
    9. private String phone = "110";
    10. public void show() {
    11. //打印外部类的属性
    12. System.out.println(name);
    13. System.out.println(age);
    14. //打印内部类属性
    15. System.out.println(address);
    16. System.out.println(phone);
    17. }
    18. }
    19. }
    20. package com.mh.fdsf_1101;
    21. import com.mh.fdsf_1101.Outer.Inner;
    22. public class TestOuter {
    23. public static void main(String[] args) {
    24. //创建内部类对象之前,需要创建外部类对象
    25. Outer outer = new Outer();
    26. //创建内部类对象
    27. Inner inner = outer.new Inner();
    28. /**
    29. 一步到位
    30. Inner inner = new Outer().new Inner();
    31. */
    32. inner.show();
    33. }
    34. }

          3. 当外部类,内部类存在重名属性时,会优先访问内部类属性。如需调用(外部类名称.this.              属性)

          4.成员内部类不能定义静态成员但可以包含静态常量


    静态内部类

    特点与用法

    不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员(级别相当于外部类,为外部类提供功能)

    详细使用方法和注意事项见代码注释

    1. package com.mehu.nbl;
    2. public class Outer {//外部类
    3. private String name="jk";
    4. private String age="0";
    5. //静态内部类与外部类相同
    6. static class Inner{
    7. private String address="hunan";
    8. private String phone = "666";
    9. //静态成员
    10. private static int count=1000;
    11. public void show() {
    12. //调用外部类属性,先创建外部类对象
    13. Outer outer = new Outer();
    14. //调用外部类对象属性
    15. System.out.println(outer.name);
    16. System.out.println(outer.age);
    17. //调用静态内部类的属性和方法
    18. System.out.println(address);
    19. System.out.println(phone);
    20. //调用静态内部类的静态属性
    21. System.out.println(Inner.count);
    22. }
    23. }
    24. }
    25. package com.mehu.nbl;
    26. public class TestOuter {
    27. public static void main(String[] args) {
    28. //直接创建静态内部类对象
    29. Outer.Inner inner = new Outer.Inner();//注意,Outer后没写括号仅表示一种包含关系
    30. //调用方法
    31. inner.show();
    32. }
    33. }

    局部内部类

    特点与用法

    定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。(详细用法和注意事项见代码注释)

    1. package com.mehu.chengyuanneibulei;
    2. public class Outer {//外部类
    3. private int age = 35;
    4. private String name ="刘德华";
    5. public void show() {
    6. String address ="cs";
    7. //局部内部类:注意不能加任何刚问修饰符
    8. class Inner{
    9. //局部内部类属性
    10. private String phone = "0";
    11. private String email ="xxxxxx";
    12. public void noval() {
    13. //访问外部类的属性
    14. System.out.println(name);
    15. System.out.println(age);
    16. //访问内部类属性
    17. System.out.println(phone);
    18. System.out.println(email);
    19. //访问局部类对象,jdk1.7要求,变量必须是常量.jdk1.8之后省略不写,自动添加
    20. System.out.println(address);
    21. }
    22. }
    23. //创建局部类对象,如果如果不创建将无法访问,注意创建位置在外部类中,内部类的后面。
    24. Inner inner = new Inner();
    25. inner.noval();
    26. }
    27. }
    28. package com.mehu.chengyuanneibulei;
    29. public class TestOuter {
    30. public static void main(String[] args) {
    31. Outer outer = new Outer();//注意不能直接创建Inner对象
    32. outer.show();//注意Outer类中一定要创建内部类对象
    33. }
    34. }

     局部内部类访问外部类当前方法中的局部变量时,应无法保障变量的生命周期与自身相同,变量必须用final修饰(可省略,系统默认添加)。(见上述代码)

    限制类(局部内部类)的使用范围


    匿名内部类

    特点与用法

    没有类名的局部内部类(一切特征都与局部内部类相同)。(其实匿名内部类的类名是系统默认给的,这里为TestUsb$1)

    必须继承一个父类或者实现一个接口。(详细见代码)

    1. package com.mehu.nimingneibulei;
    2. //接口
    3. public interface Usb {
    4. void service();
    5. }
    6. package com.mehu.nimingneibulei;
    7. public class Mouse implements Usb{
    8. @Override
    9. public void service() {
    10. System.out.println("鼠标开始工作");
    11. }
    12. }
    13. package com.mehu.nimingneibulei;
    14. public class TestUsb {
    15. public static void main(String[] args) {
    16. //创建接口类型的变量
    17. Usb usb1 = new Mouse();
    18. usb1.service();
    19. //局部内部类
    20. class fan implements Usb{
    21. @Override
    22. public void service() {
    23. System.out.println("风扇开始工作了");
    24. }
    25. }
    26. //使用局部内部类创建对象
    27. Usb usb2 = new fan();
    28. usb2.service();
    29. //局部内部类如果只使用一次,创建对象后不再使用,就会显得多余
    30. //使用匿名内部类优化(相当于创建局部内部类)
    31. Usb usb = new Usb(){//Usb可以使抽象类,也可以是父类。可以在里面重写方法
    32. @Override
    33. public void service() {
    34. System.out.println("风扇开始工作了");
    35. }
    36. };
    37. usb.service();
    38. }
    39. }

    匿名内部类相当于定义类,实现类,创建对象的语法合并,只能创建一个该类对象。

    优点:减少代码量。

    缺点:可读性较差。

     

     

     

  • 相关阅读:
    微信小程序面试题【100道】
    DDD基础_微服务设计为什么要选择DDD?
    linux小妙招(对比不同文件夹下的内容、kill掉后台运行的gdb进程)
    SpringCloud 集成RocketMQ实现分布式事务
    《动手学深度学习 Pytorch版》 8.6 循环神经网络的简洁实现
    半自动ORM—mybatis
    微软正式发布开源应用平台 Radius平台
    【jmeter录制浏览器上特定的单个请求】
    实时监控Mysql等数据库变化_进行数据同步_了解Debezium_--Debezium工作笔记001
    git代码管理工具保姆级教学
  • 原文地址:https://blog.csdn.net/qq_65231448/article/details/126189195