博文转自: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静态方法 */ }