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
顯然,到底執行哪一個靜態方法,是由變數的明顯型別決定的,而不是由物件的真實型別決定。這不是多型性的。
誰呼叫靜態函式,執行的靜態函式就屬於誰!
相關文章
- es5繼承和es6繼承中靜態方法、靜態屬性的差異繼承
- 靜態變數變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- Java靜態變數在靜態方法內部無法改變值Java變數
- C++靜態函式C++函式
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- [譯] 繼承 JavaScript 類中的靜態屬性繼承JavaScript
- nginx偽靜態規則重寫Nginx
- Java逆向基礎之靜態變數存取Java變數
- Java自學入門之靜態變數Java變數
- 偽靜態、靜態和動態的區別
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- 對於systemverilog靜態變數和動態變數 ,描述不正確的是()。變數
- java -繼承 -重寫Java繼承
- Java靜態代理Java
- oop類的繼承與類靜態成員學習OOP繼承
- 類內的靜態成員函式函式
- url_for函式與靜態檔案函式
- C++八股之函式過載與重寫-靜態多型與動態多型C++函式多型
- Java中的靜態代理和動態代理Java
- JAVA 靜態代理 & 動態代理Java
- Spring如何為靜態變數注入值Spring變數
- 靜態域與靜態方法
- Solidity中函式返回值,靜態動態陣列Solid函式陣列
- Java靜態代理模式Java模式
- android下java的靜態庫和動態庫AndroidJava
- Java基礎系列-靜態代理和動態代理Java
- QT之靜態函式傳送訊號QT函式
- Java初始化靜態變數的時間順序Java變數
- 從零玩轉jQuery-核心函式和靜態方法jQuery函式
- Java中靜態跟非靜態的區別總結Java
- 靜態路由和動態路由路由
- 靜態代理和動態代理
- 讓你看懂dart中靜態成員和繼承|8月更文挑戰Dart繼承
- C語言--靜態區域性變數C語言變數
- 靜態
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- JavaScript 靜態屬性與靜態方法JavaScript
- net 靜態方法與非靜態方法