【JavaEE进阶系列 | 从小白到工程师】JavaEE里面的所有内部类详细介绍与使用,看这篇即可

2年前 (2022) 程序员胖胖胖虎阿
289 0 0

文章目录

  • 前言
    • 一、内部类概述
    • 二、内部类使用场景
    • 三、内部类的作用
    • 四、内部类的类型
    • 五、静态内部类(静态只能访问静态,静态内部类也适用这个定义)
      • 🌿静态内部类格式
        • ⭐代码演示
      • 🌿创建对象的格式
        • ⭐代码演示
      • 🌿静态内部类的访问拓展
      • 🌿总结
    • 六、成员内部类
      • 🍁成员内部类定义格式
        • ⭐代码演示
      • 🍁创建对象的格式
        • ⭐代码演示
      • ⚡注意⚡
    • 七、局部内部类
      • 🍃局部内部类定义格式
        • ⭐代码演示
      • 🍃创建对象格式
        • ⭐代码演示
    • 八、匿名内部类(重点)
      • 🍀 匿名内部类定义格式
      • 🍀匿名内部类的作用
      • 🍀匿名内部类的优缺点
        • ⭐代码演示
    • 九、匿名内部类的案例
      • 🌾实现集合排序
      • 🌾普通实现接口和匿名内部类实现接口的比较
  • 作者:KJ.JK

前言

                  本文介绍JavaEE里面的所有内部类详细介绍与使用

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
欢迎大家点赞👍收藏💖评论💬关注🔒
 
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者


一、内部类概述

Java中,允许一个类定义在另一个类的内部,前者称为"内部类"(寄生类),后者称为"外部类"(宿主类)
                   
          (就是在一个类中定义一个类)

          举例:在一个类A的内部义一个类B,B就被称为内部类
            

二、内部类使用场景

            当一个事物内部有一个完整的结构,而该内部结构又只为外部事物提供服务,那么该内部结构可以定义成内部类
       
            比如:人里面有一颗心脏,汽车内部有一个发动机,Cpu和电脑的关系  

三、内部类的作用

         * 内部类提供了更好的封装性
             
         * 内部类可以用private  protectecd等修饰,可以有更安全的权限控制

四、内部类的类型

             *静态内部类(static修饰)
             
             *成员内部类(无static修饰)
             
             *局部内部类(语法鸡肋,开发不会用到)
             
             *  "匿名内部类"(重点)

五、静态内部类(静态只能访问静态,静态内部类也适用这个定义)


🌿静态内部类格式

"static"修饰的内部类,类的所有的成分它都能定义 ("属性","方法","构造器","代码块","内部类")

⭐代码演示

public class Car {


    String name;

    static  String age;

    //静态内部类
    //类的所有成员都可以写在静态内部类中(属性,方法,构造器,代码块,内部类)
    public    static  class Engine{
        
        private  String brand;

        public  void start(){
            System.out.println(brand+"发动机启动");
//            System.out.println(name);     //用不了,因为静态只能访问静态,静态内部类也适用这个定义
//            System.out.println(age);     //可以使用
        }

        public static  void stop(){

            System.out.println("发动机熄火");
        }


        public Engine(String brand) {

            this.brand = brand;
        }

        public Engine() {
        }

        public String getBrand() {

            return brand;
        }

        public void setBrand(String brand) {

            this.brand = brand;
        }
    }
}

🌿创建对象的格式

                格式:
                     外部类名.内部类名 对象名 = new 外部类名.内部类构造器( );

                范例:
                       Car.Engine e=new Car.Engine("本田");

⭐代码演示

public class Test {
    public static void main(String[] args) {

        //静态内部类创建对象的格式:
        //外部类名.内部类名 对象名 =new 外部类名.内部类构造器();

        Car.Engine e=new Car.Engine("本田");

        //调用成员方法
        e.start();

        //调用静态方法
        e.stop();   // 不推荐
        Car.Engine.stop();  //使用类名调用

    }
}

【JavaEE进阶系列 | 从小白到工程师】JavaEE里面的所有内部类详细介绍与使用,看这篇即可


🌿静态内部类的访问拓展

        * 静态内部类中是否可以直接访问外部类的静态成员?  
           答:可以

        * 静态内部类中是否可以直接访问外部类的实例成员? 
           答:不可以,外部类的实例成员必须"创建外部类对象访问"!
           
             如:

public class Car {
    String name;

    static  String age;
    
    public    static  class Engine{
        
        public  void start(){
//            System.out.println(name);     //用不了,因为静态只能访问静态,静态内部类也适用这个定义
//            System.out.println(age);     //可以使用
              System.out.println(new Car().name);    //创建外部类对象访问外部类东西
        }
    }
}

🌿总结

          静态结构(静态方法,静态代码块,静态内部类)都"只能访问静态成员""不能访问实例成员"

🔥系列热门专栏🔥:
 
⚡《JavaEE进阶序列 | 从小白到工程师》系列文章⚡
 
⚡《JavaEE项目实战》系列文章⚡
 
⚡《JavaSwing项目合集》系列文章⚡
 
⚡《数据分析中的pandas》系列文章⚡


六、成员内部类


🍁成员内部类定义格式

                "无static修饰"的内部类,"4种权限修饰符都可以"修饰成员内部类。

⭐代码演示

public class Body {

    //成员内部类:心脏

    //成员内部类中不能定义静态成员

    public  class  Heart{
        private  String color;

//        private  static  int a;
        //因为静态的东西总是会随着类的调用而产生,而这个是成员内部类,静态先产生没有地方放它,所以不合理


        public String getColor() {

            return color;
        }

        //跳动
        public  void beat(){

            System.out.println(color+"的心脏跳动");
        }


        public void setColor(String color) {

            this.color = color;
        }

        public Heart(String color) {

            this.color = color;
        }

        public Heart() {
        }
    }
}


🍁创建对象的格式

        格式:
             外部类名.内部类名 对象名 = new 外部类构造器( ).new 内部构造器( );    

        范例:
              Body.Heart bh=new Body().new Heart();

//成员内部类依赖外部类的,要先创建外部类的对象,才能创建内部类

⭐代码演示

public class Test {
    public static void main(String[] args) {

        //创建成员内部类对象
        //成员内部类依赖外部类的,要先创建外部类的对象,才能创建内部类
        //格式1:
        Body body=new Body();
        Body.Heart  h=body.new Heart();

        h.setColor("红色");
        h.beat();


        System.out.println("------");

        //简写格式2:
        Body.Heart bh=new Body().new Heart();

        bh.setColor("绿色");
        bh.beat();


    }
}

【JavaEE进阶系列 | 从小白到工程师】JavaEE里面的所有内部类详细介绍与使用,看这篇即可


⚡注意⚡

    * 成员内部类是依附外部类而存在的,要创建成员内部类的对象,需要先创建外部类的对象
           如:  Body.Heart bh=new Body().new Heart();
    
    * 成员内部类中不能定义静态成员(但是可以定义静态常量)(JDK17后可以定义)

七、局部内部类


🍃局部内部类定义格式

                局部内部类放在方法、代码块、构造器等执行体中

⭐代码演示

public class Test {
    public static void main(String[] args) {

        //定义在方法中的内部类,叫做局部内部类
        //不能加修饰符,因为加不加都只能在这个大括号里面用
        class  Inner{
            public  void show(){
                System.out.println("局部内部类的方法");
            }
        }
    }
}

🍃创建对象格式

                Inner in=new Inner();
                in.show();

⭐代码演示

public class Test {
    public static void main(String[] args) {

        //定义在方法中的内部类,叫做局部内部类
        //不能加修饰符,因为加不加都只能在这个大括号里面用
        class  Inner{
            public  void show(){
                System.out.println("局部内部类的方法");
            }
        }

        //创建对象
        Inner in=new Inner();
        in.show();
    }
}

【JavaEE进阶系列 | 从小白到工程师】JavaEE里面的所有内部类详细介绍与使用,看这篇即可


八、匿名内部类(重点)


🍀 匿名内部类定义格式

         * 匿名内部类是指"没有名字的类", "定义类的同时也创建了对象"
                  
         * 使用前提:需要存在一个"接口""抽象类"
             
         *  格式:  new 抽象类名或者接口名() {
	                 //重写方法;
                     };

         *  范例:   
                 Usb u2=new Usb() {
                   @Override
                   public void connect() {
                       System.out.println("鼠标连接");
                    }
                 };     //可以看成一个创建对象的过程

🍀匿名内部类的作用

   * 匿名内部类一般作为"方法实参"而使用,目的是为了"实现父类或接口中的抽象方法"
       
   * 开发中经常使用匿名内部类简化代码
       
//匿名内部类实现接口:直接创建接口的匿名内部类 (如果只是想要用这个接口一次的话,用这个就简化)       

🍀匿名内部类的优缺点

                  * 优点:简化代码                        (如果只是想要用这个接口一次的话,用这个就简化)
                  
                  * 缺点:当要使用多次的时候就会显得繁琐      (当使用多次的时候就会显得繁琐)

⭐代码演示

public class Test {
    public static void main(String[] args) {


        //2.创建实现类的对象
//        Usb u1=new Mouse();


        //匿名内部类实现接口:直接创建接口的匿名内部类(如果只是想要用这个接口一次的话,用这个就简化)
        //优点:简化代码
        Usb u2=new Usb() {
            @Override
            public void connect() {

                System.out.println("鼠标连接");
            }
        };     //可以看成一个创建对象的过程

        u2.connect();


        //缺点:当要使用多次的时候就会显得繁琐
        /*
            如:
             Usb u2=new Usb() {
            @Override
            public void connect() {
                System.out.println("鼠标连接");
            }
        };

         Usb u22=new Usb() {
            @Override
            public void connect() {
                System.out.println("鼠标连接");
            }
        };

         */

    }
}


//普通使用接口的步骤
//1.定义实现类,实现接口


//class  Mouse implements  Usb{
//
//
//    @Override
//    public void connect() {
//        System.out.println("鼠标连接");
//    }
//}

【JavaEE进阶系列 | 从小白到工程师】JavaEE里面的所有内部类详细介绍与使用,看这篇即可


九、匿名内部类的案例


🌾实现集合排序

import java.util.ArrayList;
import java.util.Comparator;

public class Test {
    public static void main(String[] args) {


        ArrayList<Integer> list =new ArrayList<>();

        list.add(9);
        list.add(5);
        list.add(1);
        list.add(3);



        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return 02 -01; //降序
//                return 01-02  //升序
            }
        });

        System.out.println(list);
    }
}


🌾普通实现接口和匿名内部类实现接口的比较

public interface Usb {
    public  abstract  void connect();

}

class  A implements  Usb{

    @Override
    public void connect() {
        System.out.println("普通方式实现接口连接");
    }
}


public class Test {
    public static void main(String[] args) {

        Usb u=new A();
        useDevice(u);
        
        //用匿名内部类做
        //匿名内部类当作方法的实参去使用
        Usb u1=new Usb() {
            @Override
            public void connect() {
                System.out.println("匿名内部类连接");
            }
        };
        useDevice(u1);
    }
    public  static  void useDevice(Usb usb){
        System.out.println("使用设备");
        usb.connect();
    }
}


【JavaEE进阶系列 | 从小白到工程师】JavaEE里面的所有内部类详细介绍与使用,看这篇即可


作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

相关文章

暂无评论

暂无评论...