(1)静态变量和静态方法是否可以被继承?
1 class 父类{ 2 //静态变量和静态方法是否可以被继承?? 3 4 public static String 父类静态变量 = "我是父类静态变量"; 5 6 public static void 父类静态方法() { 7 System.out.println("我是父类静态方法"); 8 } 9 10 } 11 12 class 子类 extends 父类{ 13 //空 14 } 15 16 public class Test { 17 //静态变量和静态方法是否可以被继承? 18 19 public static void main(String[] args) { 20 子类 子类的对象 = new 子类(); 21 //子类对象 22 23 子类.父类静态方法(); 24 //子类通过类名调用继承的静态方法 25 26 子类的对象.父类静态方法(); 27 //子类通过对象调用继承的静态方法 28 29 String _1 = 子类.父类静态变量; 30 //子类通过类名调用继承的静态变量 31 32 System.out.println("子类.父类静态变量======"+_1); 33 34 String _2 = 子类的对象.父类静态变量; 35 //子类通过对象调用继承的静态变量 36 37 System.out.println("子类的对象.父类的静态变量======"+_2); 38 } 39 40 } 41 42 //代码的运行结果如下 43 我是父类静态方法 44 我是父类静态方法 45 子类.父类静态变量======我是父类静态变量 46 子类的对象.父类的静态变量======我是父类静态变量
根据上述代码,父类的静态变量和静态方法是可以被子类继承的。
(2)静态变量能否被隐藏?静态方法能否被重写?
1 class 父类{ 2 //静态变量能否被隐藏?静态方法能否被重写? 3 4 public static String 父类静态变量 = "我是父类静态变量"; 5 6 public static void 父类静态方法() { 7 System.out.println("我是父类静态方法"); 8 } 9 10 } 11 12 class 子类 extends 父类{ 13 public static String 父类静态变量 = "我是子类静态变量"; 14 15 public static void 父类静态方法() { 16 System.out.println("我是子类重写的静态方法"); 17 } 18 19 } 20 21 public class Test { 22 //静态变量能否被隐藏?静态方法能否被重写? 23 24 public static void main(String[] args) { 25 子类 子类对象 = new 子类(); 26 //子类对象 27 28 父类 子类的上转型对象 = new 子类(); 29 //子类对象上转型 30 31 子类.父类静态方法(); 32 //子类通过类名调用重写的静态方法 33 34 子类对象.父类静态方法(); 35 //子类对象调用重写的静态方法 36 37 子类的上转型对象.父类静态方法(); 38 //子类通过上转型对象调用重写的静态方法 39 40 String _1 = 子类.父类静态变量; 41 //子类通过类名调用子类的静态变量 42 43 System.out.println("子类.父类静态变量======"+_1); 44 45 String _2 = 子类对象.父类静态变量; 46 //子类对象调用子类的的静态变量 47 48 System.out.println("子类对象.父类静态变量======"+_2); 49 50 String _3 = 子类的上转型对象.父类静态变量; 51 //子类通过上转型对象调用隐藏的父类静态变量 52 53 System.out.println("子类的上转型对象.父类的静态变量======"+_3); 54 } 55 56 } 57 58 //代码的运行结果如下 59 我是子类重写的静态方法 60 我是子类重写的静态方法 61 我是父类静态方法 62 子类.父类静态变量======我是子类静态变量 63 子类对象.父类静态变量======我是子类静态变量 64 子类的上转型对象.父类的静态变量======我是父类静态变量
通过上述代码来看,静态变量的确被隐藏了,用子类对象和子类上转型对象去调用静态变量结果是不同的。静态方法并不能够被重写,也被隐藏了,用子类对象和子类上转型对象调用静态方法结果是不同的。
我查阅了许多博客,得出的结论是这样的:我们在用对象调用静态变量和静态方法其实是没有意义的,运行时只看这个所要用的静态变量和静态方法是哪个类的,用的就是哪个类里的静态变量和静态方法。
综上所述,父类中的静态变量,静态方法会被子类继承,并且都会被子类同名的静态变量,静态方法所隐藏。我们在看代码的时候只需要看调用静态变量和静态方法的所属类来判断即可,而我们在使用静态变量和静态方法最好都使用类名去调用。
参考博客:https://blog.csdn.net/gao_zhennan/article/details/72892946
https://blog.csdn.net/fcability/article/details/17352109
https://blog.csdn.net/dawn_after_dark/article/details/74357049
学识浅薄,如有错误,恳请斧正,在下不胜感激。