Java中内部类可分四种为:
1.成员内部类
2.方法(局部)内部类
3.静态内部类
4.匿名内部类
其中最常见的就是成员内部类,也称为内部类。
接下来我们就通过代码了解什么是成员内部类,和成员内部类的作用。
新建一个Person类,在Person类中再建一个Heart类,其中Heart就为成员内部类,Person为Heart的外部类。其中Heart可以用任意修饰符修饰(public、protected、private等),不使用修饰符则是默认的访问权限,在此我们不使用修饰符。
package people;
//外部类
public class Person {
int age;
//获取内部类的方法
public Heart getHeart(){
return new Heart();
}
//成员内部类
class Heart{
public String beat(){
return Person.this.age+"心脏再跳动!";
}
}
}
接下来我们将这个成员内部类实例化,新建一个测试类,命名为PeopleTest。
package people;
//将内部类实例化
public class PeopleTest {
public static void main(String[] args) {
Person lili=new Person();
lili.age=12;
//获取内部类对象实例
//方式1:new 外部类.new 成员内部类
Person.Heart myHeart=new Person().new Heart();
System.out.println(myHeart.beat());
//方式2:外部类对象.new 内部类
Person.Heart myHeart1=lili.new Heart();
System.out.println(myHeart1.beat());
//方式3:外部类对象.获取方法
Person.Heart myHeart2= lili.getHeart();
System.out.println(myHeart2.beat());
}
}
在测试类PeopleTest中通过3种方式对成员内部类Heart进行实例化。但是这3种方式都是需要由外部类信息才能完成实例化。所以我们可以得出结论:成员内部类在外部使用时,无法直接实例化,需要由外部类信息才能完成实例化。
在测试类中我们同时对age进行赋值,现在我们运行一下查看运行结果。
E:\JDK-11\bin\java.exe Dfile.encoding=UTF-8 -classpath D:\IDEA\untitled\out\production\untitled people.PeopleTest
0心脏再跳动!
12心脏再跳动!
12心脏再跳动!
进程已结束,退出代码为 0
通过方式1实例化的内部类输出的age的值为默认值0,原因是我们通过new关键字产生的新实例对象,在这个实例对象产生的过程当中并没有对age这个属性产生赋值的过程,所以在这里age使用默认值0。t通过方式2和方式3产生的实例对象则成功给age赋值。
对于内部类和外部类的成员访问:
内部类可以直接访问外部类成员,如果内部类和外部类出现同名属性,内部类在使用时优先访问内部类中定义的属性
如果使用外部类的同名属性的话可以这样调用
外类名.this.属性名
如果外部类访问内部类的成员,则需要通过内部类的实例才能获取到。
new 内部类名().属性名=属性值;
注:本篇文章仅个人见解,若有错误,欢迎指正!