一、成员变量:

  Java中对于子类中定义与夫类具有相同的签名的变量 是采取隐藏的方式,而不是覆盖。

测试代码如下:

public class A extends  B{
    static int static_ = 4;
    int nonStatic = 5;

}

class B {
    static int static_ = 3;
    int nonStatic = 4;
}
public class Main {
    public static void main(String[] args) {

        //非静态测试
        A a = new A();
        B b = new B();
        B a1 = (B)a;

        System.out.println(a.nonStatic);
        System.out.println(b.nonStatic);
        System.out.println(a1.nonStatic);

    }
}


Print Res:

5
4
4

 

1.对于非静态成员变量:

  a. 我们可以看出,子类只是隐藏了父类的成员变量,当我们通过夫类的类型引用访问该变量时,就会访问到定义在夫类中的该成员变量。

  b.我们也可以在子类中通过super关键字对父类中的变量进行操作。

  这里比较值得注意的就是:我们应该尽量避免无效的隐藏,因为隐藏变量是会占用内空间的。 探究这些问题,主要就是为了我们编写更高效的程序。当我们在编程时应该知道我们为什么这么做,也要明白为什么不那么做,避免编程的随意性。编程语言为我们提供了开发的基础,但却并未向我们保证能开发出高质量的软件,这需要我们基于自己对编程语言的理解以及他人的见解来思考如何编写高质量的程序。

2.对于静态成员变量:静态变量是与类绑定的,我们一般都是通过类来访问 静态成员变量 , 所以它又叫类变量。 对于静态成员变量也是遵循隐藏机制的。

 

二、成员方法:

 a. 成员方法的覆盖,要满足:

  1.两同 : 方法名和参数列表相同

  2.两小: 返回类型和抛出错误类型小于父类

  3.一大: 访问权限大于父类

  

  此外还要保证方法签名的一致。 方法签名包括方法名和参数列表,其中参数列表包括参数类型、顺序、个数。

 

  其实,这些都是Java语言定义好的覆盖必须要遵循的规则。那么Java语言为什么要这么规定呢?作为面向对象语言,肯定要符合面向对象的五大原则 SOLID,这里的就体现了 其中的 里氏替换原则(L)。

 b.成员方法的重载:

  当我们进行方法重载时:

  1.要更改成员变量列表

  2.可以更改方法权限、可以更改方法返回值,可以更改错误抛出类型。