java靜態變數和靜態函式是否可以被繼承,重寫!
可以的,做個實驗就可以證明了:
//Test.java
class A{
static int i=9;
static void print(){System.out.println(i);}
}
class B extends A{}
public class Test{
public static void main(String[] args){
B.print();//這裡B的print()就是A裡面的
System.out.println(B.i);//這裡B.i就是A.i
}
}
結果:
>java Test
9
9
>Exit code: 0
可以被繼承的,但是不可以被重構
一個Java方法不能被子類override,也不支援多型性,並不奇怪。構造方法就是如此。TIJ說構造方法是隱含的靜態方法,我同意這個說法。
舉一個例子:
class Base
{
public static void someMethod()
{
System.out.println("in static method of Base");
}
}
class Derived extends Base
{
public static void someMethod()
{
System.out.println("in static method of Derived");
}
}
class Client
{
public static void main(String[] args)
{
Derived.someMethod();
Derived d = new Derived();
d.someMethod();
Base o = new Derived();
o.someMethod();
}
}
執行時會列印出
in static method of Derived
in static method of Derived
in static method of Base
顯然,到底執行哪一個靜態方法,是由變數的明顯型別決定的,而不是由物件的真實型別決定。這不是多型性的。
誰呼叫靜態函式,執行的靜態函式就屬於誰!
//Test.java
class A{
static int i=9;
static void print(){System.out.println(i);}
}
class B extends A{}
public class Test{
public static void main(String[] args){
B.print();//這裡B的print()就是A裡面的
System.out.println(B.i);//這裡B.i就是A.i
}
}
結果:
>java Test
9
9
>Exit code: 0
可以被繼承的,但是不可以被重構
一個Java方法不能被子類override,也不支援多型性,並不奇怪。構造方法就是如此。TIJ說構造方法是隱含的靜態方法,我同意這個說法。
舉一個例子:
class Base
{
public static void someMethod()
{
System.out.println("in static method of Base");
}
}
class Derived extends Base
{
public static void someMethod()
{
System.out.println("in static method of Derived");
}
}
class Client
{
public static void main(String[] args)
{
Derived.someMethod();
Derived d = new Derived();
d.someMethod();
Base o = new Derived();
o.someMethod();
}
}
執行時會列印出
in static method of Derived
in static method of Derived
in static method of Base
顯然,到底執行哪一個靜態方法,是由變數的明顯型別決定的,而不是由物件的真實型別決定。這不是多型性的。
誰呼叫靜態函式,執行的靜態函式就屬於誰!
相關文章
- 靜態變數和非靜態變數變數
- java繼承-靜態繫結和動態繫結Java繼承
- 函式的靜態變數 static函式變數
- C#靜態建構函式及靜態變數學習C#函式變數
- 繼承與派生,多繼承,函式過載,建構函式呼叫順序 靜態多型和動態多型繼承函式多型
- 靜態變數與靜態方法變數
- es5繼承和es6繼承中靜態方法、靜態屬性的差異繼承
- 避免因在類中使用靜態函式而大量使用靜態變數 (轉)函式變數
- 靜態變數和Session變數Session
- 靜態變數變數
- 靜態資料成員和靜態成員函式函式
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- Java靜態變數在靜態方法內部無法改變值Java變數
- Java靜態變數塊使用案例Java變數
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- C++靜態函式C++函式
- Java自學入門之靜態變數Java變數
- 靜態持續變數變數
- 靜態全域性變數和全域性變數變數
- 靜態變數和例項變數區別?變數
- [譯] 繼承 JavaScript 類中的靜態屬性繼承JavaScript
- 全域性變數和靜態變數的區別變數
- Java逆向基礎之靜態變數存取Java變數
- java優化程式設計-靜態變數Java優化程式設計變數
- static靜態變數的理解變數
- js中的靜態變數JS變數
- java靜態代理和動態代理Java
- 繫結變數在靜態sql和動態sql中變數SQL
- 偽靜態、靜態和動態的區別
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- Jni函式的靜態繫結函式
- C/C++ 靜態變數解析C++變數
- PHP的靜態變數介紹PHP變數
- VBA靜態變數與常量(轉)變數
- java -繼承 -重寫Java繼承
- Java靜態代理Java
- oop類的繼承與類靜態成員學習OOP繼承