浅谈Java内部类及变量的调用
说到Java的内部类大致分为以下四种:成员内部类、局部内部类、匿名内部类、静态内部类。
这次我们先谈谈最为简单的成员内部类
首先,成员内部类是直接定义在另一个类中(与成员并列),它可以用所有的修饰符修饰。
这里有一个Father类,里面有定义的一个成员内部类Son
public class Father {
private String fatherName = "父亲";
public int age = 40;
protected int money;
public void setMoney(int money){
this.money = money;
}
public void showAge(){//展示父亲的年龄
System.out.println("父亲的年龄:" + age);
}
public void showMoney(){//展示父亲的钱
System.out.println("父亲的钱:" + money);
}
class Son{//Father类中定义的内部类Son类
public String name = "儿子";
public int age = 13;
public void showFatherName(){
System.out.println("儿子说出父亲的姓名:"+fatherName);
}
public void showAge(){//展示儿子的年龄
System.out.println("儿子的年龄:" + age);
}
public void showFatherAge(){//展示父亲的年龄
System.out.println("儿子说出父亲的年龄:" + Father.this.age);
}
public void cut(){
money -= 1;
System.out.println("儿子用了父亲1元");
}
}
如果要使用成员内部类的属性/方法,必须创建对象来调用。
public static void main(String[] args) {
Father father = new Father();
Son son = father.new Son();
son.showAge();
}
运行结果:
成员内部类可以直接调用外部类所有属性,包括private(私有)修饰的。如上述Father类的fatherName属性就是私有的,但是Son类中showFatherName()方法能直接调用该属性。
public static void main(String[] args) {
Father father = new Father();
Son son = father.new Son();
son.showAge();
son.showFatherName();
}
运行结果:
若内部类与外部类属性重名,则可以通过 外部类类名.this.属性名 的方式调用外部类属性。如上述Son类中的age与Father类中的age重名了,所以showFatherAge()方法中内部类是以Father.this.age的方式调用Father中的age属性。
public static void main(String[] args) {
Father father = new Father();
Son son = father.new Son();
son.showFatherAge();
}
运行结果:
另外特别的,内部类中调用外部类属性时,是直接指向了该属性的引用。也就是说,在内部类中对外部类属性的所有操作,会直接影响到外部类当前对象属性的值。
例如,当Son类的实例对象son调用cut()方法时,会直接修改son对应外部类的对象father的money。
public static void main(String[] args) {
Father father = new Father();
father.setMoney(1000);
Son son = father.new Son();
father.showMoney();
son.cut();
father.showMoney();
}
运行结果:
通俗一点讲可以理解为 孩子可以直接使用自己父亲的钱,并且是直接扣除了父亲的钱。
