Java 中的内部类

本文详细介绍了Java中的内部类,包括实例内部类的语法规则、代码演示,静态内部类的特性和实例化方式,以及匿名内部类的使用。实例内部类不能定义静态成员变量,访问外部类成员需通过外部类名.this。静态内部类无需依赖外部类实例,可以直接创建对象。匿名内部类用于快速实现接口或继承类的功能,常用于回调和事件处理。
摘要由CSDN通过智能技术生成

一、实例内部类

1. 语法规则

(1)在实例内部类中,不能定义一个静态的成员变量,如果非要定义,只能在修饰类型之前加 static final

(2)如何通过实例内部类实例化对象?

OutClass outClass = new OutClass();
OutClass.InnerClass innerClass = outClass.new InnerClass();
//外部类名. 内部类名 + 内部类的对象变量 = 外部类的对象变量. new 内部类( )

(3)在实例内部类中,如果包含了和外部类同名的成员变量,那么如何在实例内部类中进行访问?

实例内部类中,包含两个 this,一个是外部类 this,一个是自己内部类的 this

外部类名. this.(变量) -> 访问的是外部类的成员变量
this.(变量) -> 访问的是内部类的成员变量

2. 代码演示

程序清单1:

class OutClass{
    public int a = 1;
    public int b = 2;
    public String str = "abc";

    //实例内部类,你可以把它当作是外部类的一个普通实例的成员
    class InnerClass{
        public int a = 99;
        public int b = 100;
        private int c = 3;
        public static final int d = 5;
        //public static int d = 5; //error

        public InnerClass(){
            System.out.println("内部类不带参数的构造方法");
        }

        public void test(){
            System.out.println(OutClass.this.a);
            System.out.println(this.a);
            System.out.println(OutClass.this.b);
            System.out.println(b);
            System.out.println(c);
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        OutClass outClass = new OutClass();
        OutClass.InnerClass innerClass = outClass.new InnerClass();
        innerClass.test();
    }
}

输出结果:

out

二、静态内部类

只要和 static 相关的,都与类直接相关联,而与对象并无多大关系,以下对静态内部类的测试也是如此。我们可以发现静态内部类和外部类息息相关,不需要依赖外部类实例化的对象。因为实际上,外部类中的内部类和外部类中的成员在地位上是相等的,所以语法层面也是一样的。

1. 语法规则

  1. 如何通过静态内部类实例化对象?
OutClass2 outClass2 = new OutClass2();
OutClass2.InnerClass2 innerClass2 = new OutClass2.InnerClass2();
//外部类类名.内部类类名 + 内部类的对象变量 = new 外部类类名.内部类类名()

2. 代码演示

这里有些部分和实例内部类的使用语法是一样的,我只演示一些不同的地方。

程序清单2:

class OutClass2{
    public int a = 1;
    public int b = 2;
    public String str = "abc";

    static class InnerClass2{
        public int a = 99;
        public static final int d = 5;
        public static int e = 5; //right

        public InnerClass2(){
            System.out.println("内部类不带参数的构造方法");
        }

        public void test(){
            //System.out.println(str); //error

            //正确访问外部内的成员
            System.out.println(new OutClass2().str); //right
            System.out.println(new OutClass2().a);
            System.out.println(a);
        }
    }
}
public class Test2 {
    public static void main(String[] args) {
        OutClass2 outClass2 = new OutClass2();
        OutClass2.InnerClass2 innerClass2 = new OutClass2.InnerClass2();
        innerClass2.test();
    }
}

输出结果:

out

三、匿名内部类

程序清单3:

/**
 * 匿名内部类
 */
class Unnamed{
    public void test(){
        System.out.println("abc");
    }
}

class Unnamed2{
    public void test2(){
        System.out.println("abc");
    }
}
public class Test3 {
    public static void main(String[] args) {

        //匿名对象调用 test() 方法
        new Unnamed(){

        }.test();

        new Unnamed2(){
            @Override
            public void test2() {
                System.out.println("我们可以重写 test2() 方法");
            }
        }.test2();

    }
}

输出结果:

out

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十七ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值