博文转自:https://www.cnblogs.com/mxmbk/articles/5151095.html
java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.
1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制即可以调用。
2). 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。
3). 如果在子类重写静态方法加上@Override会直接编译报错,不加@Override重写,用谁的对象/类调用就执行方法,静态方法时属于类的;静态属性同上
/**
* 父类
*/
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非静态方法");
}
}
/**
* 子类,重写父类的静态属性和静态方法
*/
public class B extends A {
public static String staticStr = "B改写后的静态属性";
public String nonStaticStr = "B改写后的非静态属性";
public static void staticMethod() {
System.out.println("B改写后的静态方法");
}
}
/**
* 子类,直接继承
*/
public class C extends A{
}
/**
* 测试类
*/
public class Test {
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();// 结果都是父类的静态方法,说明静态方法不可以被重写,不能实现多态
}
/*
A非静态属性
A静态属性
A静态方法
-------------------------------
A非静态属性
A静态属性
A静态方法
-------------------------------
B改写后的非静态属性
B改写后的静态属性
B改写后的静态方法
-------------------------------
A非静态属性
A静态属性
A静态方法
*/
}