继承中成员变量的访问特点

当类之间产生了关系后,其中各类中的成员变量,有产生了哪些影响呢?

成员变量不重名

如果子类父类中出现不重名的成员变量,这时的访问是没有影响的

成员变量重名时

创建子类对象时,访问有两种方式:

  • 直接通过子类对象访问成员变量:

    等号左边是谁,就优先用谁,没有则向上找。

  • 间接通过成员方法访问成员变量:

    该方法属于谁,就优先用谁,没有则向上找。

代码示例:

public class Fu {
    int numFu = 10;
    int num = 100;

    public void methodFu() {
        System.out.println(num);
    }
}

public class Zi extends Fu{
    int numZi = 20;
    int num = 200;

    public void methodZi(){
        System.out.println(num);
    }
}

public class Demo01ExtendsField {
    public static void main(String[] args) {
        Fu fu = new Fu();
        System.out.println(fu.numFu);   // 10
        System.out.println("================");

        Zi zi = new Zi();
        System.out.println(zi.numFu);   // 10
        System.out.println(zi.numZi);   // 20
        System.out.println("================");

        // 等号左边是谁,就优先用谁
        System.out.println(zi.num);     // 优先子类, 200
//        System.out.println(zi.abc);   // 到处都没有,编译报错!
        System.out.println("================");

        // 这个方法是子类的,优先用子类的,没有再向上找
        zi.methodZi();  // 200
        // 这个方法是在父类中定义的,
        zi.methodFu();  // 100
    }
}

子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要用super关键字,修饰父类成员变量,类似于之前学过的this

class Zi extends Fu {
    // Zi中的成员变量
    int num = 6;
    public void show() {
        // 访问父类中的num
        System.out.println("Fu num=" + super.num);
        // 访问子类中的num
        System.out.println("Zi num=" + this.num);
    }
}

小贴士:Fu类中的成员变量是非私有的,子类中可以直接访问。若Fu类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用private修饰成员变量,那么如何访问父类的私有成员变量呢?可以在父类中提供公共的getXxx方法和setXxx方法。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!