欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Java中继承静态属性,方法,和非静态属性和方法的继承区别

最编程 2024-02-24 11:03:20
...

结论:

Java中静态属性和静态方法是可以被继承的,但是不可以被重写,而是被隐藏。

Java中非静态属性,可以被继承,但是不可以被重写,而是被隐藏。

Java中非静态方法,可以被继承,可以被重写,因此可以实现多态

情况

属性

(1)当我们父类A中和子类B中有相同的静态属性,或者非静态属性名称的的时候,如果我们这样调用

A a = new B();

那么我们使用a变量访问的属性都是我们父类中的属性。

(2)当我们父类A中有子类B中没有的静态属性和方法的时候

A a = new B();

我们使用a变量访问的属性也是我们父类中的属性。

B b = new B();

我们使用b变量访问的属性也是我们父类中的属性(因为继承过来了)

(3)当我们父类A中和子类B中都含相同名称的静态变量和非静态变量

B b = new B();

这时候使用b变量访问的是我们B中的属性。因为属性不可以重写

关于属性总结一条规律就是 看我们 A a = new B();中调用者a的左边 访问的都是左边的属性。

 方法

(1)对于非静态方法我们都知道

A a = new B();

如果B中有这个方法,那么访问的是B中的方法,如果B中没有这个方法,访问的是从A中继承的这个方法

B b = new B();

如果B中有这个方法,那么访问的是B中的方法,如果B中没有这个方法,访问的是从A中继承的这个方法

A a  = new A();

访问的是A中的方法

关于非静态方法,总结一条就是 看我们 A a = new B();中调用者a的右边 访问的都是右边边的方法

 方法

(2)父类A中有静态方法但是子类B中有同名的静态方法

A a = new B()

调用的是A中的方法

B b = new B();

调用的是B中的方法

(2)父类A中有静态方法,但是子类B中没有这个名称的静态方法

A a = new B()

调用的是A中的方法

B b = new B();

调用的是B中从A中继承的方法

关于静态方法总结一条规律就是 看我们 A a = new B();中调用者a的左边 访问的都是左边的静态

 方法

测试例子

package com.example.test;

public class A {
    public static String staticStr = "A静态属性";
    public String nonStaticStr = "A非静态属性";
    public static void staticMethod(){
        System.out.println("A静态方法");
    }
    public void nonStaticMethod(){
        System.out.println("A非静态方法");
    }
}
package com.example.test;

public class B extends A{//子类B
    public static String staticStr = "B改写后的静态属性";
    public  String nonStaticStr = "B改写后的非静态属性";
    public static void staticMethod(){
        System.out.println("B改写后的静态方法");
    }

}
package com.example.test;

public class C extends A{//子类C继承A中的所有属性和方法

}
package com.example.test;

public class StaticExtendsTest {

    public static void main(String[] args) {
        C c = new C();
        System.out.println(c.nonStaticStr);
        System.out.println(c.staticStr);
        c.staticMethod();//输出的结果都是父类中的非静态属性、静态属性和静态方法,推出静态属性和静态方法可以被继承

        System.out.println("-------------------------------");

        A c1 = new C();
        System.out.println(c1.nonStaticStr);
        System.out.println(c1.staticStr);
        c1.staticMethod();//结果同上,输出的结果都是父类中的非静态属性、静态属性和静态方法,推出静态属性和静态方法可以被继承

        System.out.println("-------------------------------");
        B b = new B();
        System.out.println(b.nonStaticStr);
        System.out.println(b.staticStr);
        b.staticMethod();

        System.out.println("-------------------------------");
        A b1 = new B();
        System.out.println(b1.nonStaticStr);
        System.out.println(b1.staticStr);
        b1.staticMethod();//结果都是父类的静态方法,说明静态方法不可以被重写,不能实现多态
    }

}

推荐阅读