標籤:company 特點 round 多態 rgs 記錄 父類 賦值 需要
final的概念
繼承的出現提高了代碼的複用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,就可以對其中的方法進行重寫,那怎麼解決呢?要解決上述的這些問題,需要使用到一個關鍵字final,final的意思為最終,不可變。final是個修飾符,它可以用來修飾類,類的成員,以及局部變數。不能修飾構造方法。
final的特點
final修飾類不可以被繼承,但是可以繼承其他類。
final 除了構造方法不能修飾,其餘的均可修飾;
class Yy {}
final class Fu extends Yy{} //可以繼承Yy類
class Zi extends Fu{} //不能繼承Fu類
final修飾的方法不可以被子類重寫但可以繼承,父類中沒有被final修飾方法,子類重寫後可以加final。
class Fu {
// final修飾的方法,不可以被覆蓋,但可以繼承使用
public final void method1(){}
public void method2(){}
}
class Zi extends Fu {
//重寫method2方法
public final void method2(){}
}
final修飾的變數稱為常量,這些變數只能賦值一次。而且終身不變。
final int i = 20;
i = 30; //賦值報錯,final修飾的變數只能賦值一次
參考型別的變數值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改。
final Person p = new Person();
Person p2 = new Person();
p = p2; //final修飾的變數p,所記錄的地址值不能改變
p.name = "小明";//可以更改p對象中name屬性值
p不能為別的對象,而p對象中的name或age屬性值可更改。
修飾成員變數,需要在建立對象前賦值,否則報錯。可以通過構造方法進行賦值(當沒有顯式賦值時,多個構造方法的均需要為其賦值
class Demo {
//直接賦值
final int m = 100;
//final修飾的成員變數,需要在建立對象前賦值,否則報錯。
final int n;
public Demo(){
//可以在建立對象時所調用的構造方法中,為變數n賦值
n = 2016;
}
}
static概念
當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過建立本類對象調用的。當在調用對象的某個方法時,這個方法沒有訪問到對象的特有資料時,方法建立這個對象有些多餘。可是不建立對象,方法又調用不了,這時就會想,那麼我們能不能不建立對象,就可以調用方法呢?
可以的,我們可以通過static關鍵字來實現。static它是靜態修飾符,一般用來修飾類中的成員。
static特點
被static修飾的成員變數屬於類,不屬於這個類的某個對象。(也就是說,多個對象在訪問或修改static修飾的成員變數時,其中一個對象將static成員變數值進行了修改,其他對象中的static成員變數值跟著改變,即多個對象共用同一個static成員變數)
代碼示範:
class Demo {
public static int num = 100;
}
class Test {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 200;
System.out.println(d1.num); //結果為200
System.out.println(d2.num); //結果為200
}
}
被static修飾的成員可以並且建議通過類名直接存取。
訪問靜態成員的格式:
類名.靜態成員變數名
類名.靜態成員方法名(參數)
對象名.靜態成員變數名 ------不建議使用該方式,會出現警告
對象名.靜態成員方法名(參數) ------不建議使用該方式,會出現警告
代碼示範:
class Demo {
//靜態成員變數
public static int num = 100;
//靜態方法
public static void method(){
System.out.println("靜態方法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
static注意事項
靜態內容是優先於對象存在,只能訪問靜態,不能使用this/super。靜態修飾的內容存於靜態區。
class Demo {
//成員變數
public int num = 100;
//靜態方法
public static void method(){
//this.num; 不能使用this/super。
System.out.println(this.num);
}
}
同一個類中,靜態成員只能訪問靜態成員
class Demo {
//成員變數
public int num = 100;
//靜態成員變數
public static int count = 200;
//靜態方法
public static void method(){
//System.out.println(num); 靜態方法中,只能訪問靜態成員變數或靜態成員方法
System.out.println(count);
}
}
l main方法為靜態方法僅僅為程式執行入口,它不屬於任何一個對象,可以定義在任意類中。
l 多態調用方法中,編譯看=左邊,父類有,編譯成功,父類沒有,編譯失敗
運行,靜態方法,運行父類中的靜態方法,
運行,非靜態方法,運行子類的重寫方法
成員變數,編譯運行全是父類
定義靜態常量
開發中,我們想在類中定義一個靜態常量,通常使用public static final修飾的變數來完成定義。此時變數名用全部大寫,多個單詞使用底線串連。
定義格式:
public static final 資料類型 變數名 = 值;
如下示範:
class School {
public static final String SCHOOL_NAME = "北京大學";
public static void method(){
System.out.println("一個靜態方法");
}
}
當我們想使用類的靜態成員時,不需要建立對象,直接使用類名來訪問即可。
System.out.println(Company.SCHOOL_NAME);
Company.method(); // 調用一個靜態方法
注意:
介面中的每個成員變數都預設使用public static final修飾。
所有介面中的成員變數已是靜態常量,由於介面沒有構造方法,所以必須顯示賦值。可以直接用介面名訪問。
interface Inter {
public static final int COUNT = 100;
}
提供者中的靜態變數
Inter.COUNT
java -> final與static 關鍵字