局部内部类
首先,我们先来了解一下局部内部类的概念,在此之前我们先来认识一下什么叫做内部类。内部类?在谁的内部?答案当然是在类的内部!如下,我们在一个类的内部再去创建一个类,在类的内部中的这个类就叫做内部类。
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是相同的,也就是说验证了我们的说法,这两个对象是同一个!