美文网首页简友广场IT@程序员猿媛读书
静态方法和属性可以被继承吗?

静态方法和属性可以被继承吗?

作者: 您好简书 | 来源:发表于2019-03-28 07:38 被阅读1次
结论:静态方法和属性可以被继承,但是不能被重写。

我们将结论延伸一下:

我们知道,类的是由成员变量和方法组成的,成员变量代表类的属性,而方法则代表类的行为。

而具体根据静态与否,可以分为

1.静态的成员变量

2.非静态的成员变量

3.静态的方法

4.非静态的方法

下边给出延伸的结论:

上述的四种成员变量和方法,只有非静态的方法可以被继承并且被重写(override)

而另外的三种,静态的成员变量/方法、非静态的成员变量,只能被继承,但是不能被重写,而是被隐藏

在java中多态之所以能实现,主要依赖于继承和重写。有了继承和重写,就可以实现父类的引用指向不同的子类对象。而重写的最主要功能则是:在父类引用,调用子类重写的方法之后,调用的是子类重写的方法,也可以理解为,子类重写的方法优先级高于父类。但是对于隐藏来说,则没有这种优先级的“特权”。

下边我们来通过具体的代码来验证结论



package cn.qiaoh.inheritance;
 
public class A {
    public static String staticStr = "A静态成员变量";
    public String str = "A非静态成员变量";
    public static void staticMethod() {
        System.out.println("A静态方法");
    }
    public void method(){
        System.out.println("A非静态方法");
    }
}
package cn.qiaoh.inheritance;
 
public class C extends A {
 
}
package cn.qiaoh.inheritance;
 
public class B extends A{
    public static String staticStr = "B静态成员变量";
    public String str = "B非静态成员变量";
    public static void staticMethod() {
        System.out.println("B静态方法");
    }
    public void method(){
        System.out.println("B非静态方法");
    }
}
package cn.qiaoh.inheritance;
 
import org.junit.Test;
 
public class StaticInheritance {
    
    @Test
    public void test01() {
        A a = new C();
        System.out.println(a.str);
        System.out.println(a.staticStr);
        a.staticMethod();
        a.method(); 
        //输出结果全部为父类A中的成员变量和方法,证明了静态的方法和成员变量可以被继承
    }
    
    @Test
    public void test02() {
        A a = new B();
        System.out.println(a.str);//A的非静态成员变量
        System.out.println(a.staticStr);//A的静态成员变量
        a.method();//B的成员方法
        a.staticMethod();//A的静态成员方法
        
        //只有非静态的方法成功完成了重写,另外三个都是父类的方法和变量
    }
}

例子:

package com.study.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.study.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.study.test;

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

}
package com.study.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();//结果都是父类的静态方法,说明静态方法不可以被重写,不能实现多态
    }

}

相关文章

网友评论

    本文标题:静态方法和属性可以被继承吗?

    本文链接:https://www.haomeiwen.com/subject/cdkfbqtx.html