(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
學識淺薄,如有錯誤,懇請斧正,在下不勝感激。