局部内部类

局部内部类

首先,我们先来了解一下局部内部类的概念,在此之前我们先来认识一下什么叫做内部类。内部类?在谁的内部?答案当然是在类的内部!如下,我们在一个类的内部再去创建一个类,在类的内部中的这个类就叫做内部类。

class Outer {
    int n1 = 1;
    public void say() {

    }
    class Inner {
        int n2 = 2;
        public void say1() {

        }
    }
}
class Other {
    
}

如上述代码块中所示,Outer类叫做外部类,Inner类叫做内部类,Other类叫做外部其他类。

根据内部类被定义的位置不同,可以将内部类分为局部内部类和成员内部类(匿名内部类属于局部内部类),局部内部类,顾名思义是定义在外部类的局部位置(外部类的方法体和代码块中)。

当然呢,在这里希望大家可以搞清两个概念,首先,内部类定在外部类的方法体中,那么它的地位就相当于是一个局部变量,它只能在此方法体中被使用(被继承、创建对象等)。其次呢,它本质上还是一个类,具有类的一切特征。(其中可以含有类的五大成员)

示例如下

public class Innerclass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.say();
        outer.f1();

    }
}
class Outer {
    int n1 = 1;
    public void say() {
        System.out.println("这是外部类outer中的say方法");
    }
    public void f1() {
        class Inner {
            int n2 = 2;
            public void say1() {
                System.out.println("这是内部类inner中的say1方法");
            }
        }
        Inner inner = new Inner();
        inner.say1();

    }

}

那么,大家可以根据代码块中的代码,思考一下会输出哪些内容?(注意我创建内部类的位置!!!)

输出结果如下

这是外部类outer中的say方法
这是内部类inner中的say1方法

接下来,我们思考一个问题,如果在外部类和内部类中含有同样的属性名或者是方法名,那么创建内部类的实体对象之后,通过这个对象来调用这个属性名和方法名之后,会得到怎样的结果呢?

public class Innerclass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.say();
        outer.f1();

    }
}
class Outer {
    int n1 = 1;
    public void say() {
        System.out.println("这是外部类outer中的say方法");
    }
    public void f1() {
        class Inner {
            int n1 = 2;
            public void say1() {
                System.out.println("这是内部类inner中的say1方法");
                System.out.println("n1 "+n1);            }
        }
        Inner inner = new Inner();
        inner.say1();

    }

}

如果outer类中和inner类中具有同样的属性名n1,那么输出的n1的值为多少?

输出结果如下

这是外部类outer中的say方法
这是内部类inner中的say1方法
n1 2

由结果可知,输出的是内部类inner中n1的值,自此,我们引出就近原则,也就是说,当外部类和内部类中含有同名的属性,这时通过内部类的对象来调用这个属性,就输出的是内部类的属性,那么又有一个新的问题,如果我们想通过内部类对象调用外部类的属性,那么应该如何操作呢?

在这里直接给出答案,如上述代码所示,我们可以通过Outer.this.n1来调用外部类的n1属性,在这里我们可以理解为Outer.this就是一个对象,是哪个对象呢?答案就是,哪个方法调用f1

方法就是哪个对象,我们可以通过对象的哈希码值来进行验证。

示例如下

System.out.println("外部类的n1属性"+Outer.this.n1);
System.out.println("Outer.this的hashcode是"+Outer.this);
System.out.println("对象outer的hashcode是"+outer);

输出结果为

外部类的n1属性1
Outer.this的hashcode是HspJava.Outer@1540e19d
对象outer的hashcode是HspJava.Outer@1540e19d

由输出结果可知,outer和Outer.this的hashcode是相同的,也就是说验证了我们的说法,这两个对象是同一个!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值