浅谈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();

    }

运行结果:

通俗一点讲可以理解为 孩子可以直接使用自己父亲的钱,并且是直接扣除了父亲的钱。

经验分享 程序员 微信小程序 职场和发展