Java基础 四种内部类

本文详细介绍了Java中的四种内部类:静态内部类、实例内部类、局域内部类和匿名内部类。通过示例代码展示了它们的定义与使用,包括如何访问外部类成员以及匿名内部类在多态场景下的应用。强调了内部类与外部类之间的关系和访问限制,以及匿名内部类在简化代码方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内部类

一个类定义在另一个类的内部;可以把内部类理解成寄生、外部类理解成宿主(人-> 心脏,汽车->发动机)

java类的五大成分:成员变量、成员方法、构造器、代码块、内部类

内部了的分类:

  1. 静态内部类
  2. 实力内部类
  3. 局域内部类【很少见】
  4. 匿名内部类【使用频繁】

 

(1)静态内部类

【定义&使用】

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

        System.out.println(Outer.num1);         // 10
        System.out.println(new Outer().num2);   // 20

        System.out.println(Outer.Inner.num3);   // 30
        System.out.println(new Outer.Inner().num4); // 40
        
        // 定义内部类对象 外.内 对象 = new 外.内();
        Outer.Inner in = new Outer.Inner();
    }
}


class Outer {
    static int num1=10;
    int num2=20;

    static class Inner{
        static int num3=30;
        int num4=40;
    }
}

(2)实例内部类

【定义&使用】 注意:1、内部类不内用static关键字,static是类属性、方法;2、private在外部类&内部类中是可以相互访问的。

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

        // 外部对象
        Outer ou = new Outer();
        System.out.println("ou.num1="+ou.num1);

        // 实例内部类
        // 分步实现    外类.内类 in_1 = 外对象.new 内类();
        Outer.Inner in_1 = ou.new Inner();
        System.out.println(in_1.num2);

        // 外类.内类 in = new 外类().内类()
        Outer.Inner in = new Outer().new Inner();
        System.out.println("in.num2="+in.num2);

        in.show();

    }
}


class Outer {
    private int num = 50;
    int num1 = 10;

    class Inner {
        private int num = 60;
        int num2 = 20;

        public void show() {
            int num = 70;
            System.out.println("show:num="+num);
            System.out.println("inner:num="+this.num);
            System.out.println("outer:num="+Outer.this.num);
        }
    }
}

运行结果:

  • ou.num1=10
  • in.num2=20
  • show:num=70
  • inner:num=60
  • outer:num=50

(3)局域内部类【很少见】

【定义&使用】 注意:从内部类引用的本地变量必须是最终变量或实际上的最终变量, 可通过反编译生成的class文件观察这个现象

public class AreaClass {

    // 修饰符 返回值类型 方法名(参数列表)
    public static void main(String[] args) {

        // 1- 内部类访问的变量&方法必须是在该类声明前
        // 2-从内部类引用的本地变量必须是最终变量或实际上的最终变量
        final int num = 10;
        // 局域内部类

        class Inner{
            public void show(){
                System.out.println("num="+num); //10
            }
        }

        //num=20;

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

    }
}

运行结果:num=10

 

(4)匿名内部类【使用频繁】

前提:匿名内部类必须要有父类、父接口,这个匿名类就是父类、父接口的子类

常规的步骤:1、定义子类Mouse;2、重写方法;3、创建子类对象 mouse;4、调用重写后的方法 

如果定义一个只使用一次的类可以使用匿名内部类,目的是为了简化代码

public class AnonymityClass {

    public static void main(String[] args) {

        // 0 历史
        Mouse mouse = new Mouse();
        mouse.UsbProtocol();

        // 1 匿名类
        new Usb(){
            @Override
            public void UsbProtocol() {

            }
        }.UsbProtocol();


        // 2 多态格式: 父类型接收
        Usb usb2 = new Usb(){
            @Override
            public void UsbProtocol() {
                System.out.println("匿名内部类-多态格式: 父类型接收");
            }
        };
        usb2.UsbProtocol();


        // 3 多态中的: 参数多态
        show(new Usb() {
            @Override
            public void UsbProtocol() {
                System.out.println("匿名内部类-多态格式: 参数多态");
            }
        });


        // 4 多态中的 返回值多态
        Usb usb4 = call2();
        usb4.UsbProtocol();


    }

    // 方法1  参数多态
    public static void show(Usb usb ){
        usb.UsbProtocol();
    }

    // 方法2 返回值多态
    public static Usb call2(){
        return new Usb() {
            @Override
            public void UsbProtocol() {
                System.out.println("匿名内部类-多态格式: 返回值多态");
            }
        };
    } // end call2


} // end AnonymityClass


// 父接口
interface Usb{
    public void UsbProtocol();
}


class Mouse implements Usb{
    @Override
    public void UsbProtocol() {
        System.out.println("实现USB接口协议");
    }
}

运行结果:

  • 实现USB接口协议
  • 匿名内部类-多态格式: 父类型接收
  • 匿名内部类-多态格式: 参数多态
  • 匿名内部类-多态格式: 返回值多态

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值