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屬性值
修飾成員變量,需要在創建對象前賦值,否則報錯。
class Demo {
//直接賦值
final int m = 100;
//final修飾的成員變量,需要在創建對象前賦值,否則報錯。
final int n;
public Demo(){
//可以在創建對象時所調用的構造方法中,爲變量n賦值
n = 2016;
}
}
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();
}
}
靜態內容是優先於對象存在,只能訪問靜態,不能使用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);
}
}
main方法爲靜態方法僅僅爲程序執行入口,不屬於任何一個對象,可以定義在任意類中。
定義靜態常量 通常使用public static final 修飾的變量 來完成靜態常量的定義。此時變量名用全部大寫,多個單詞使用下劃線連接。定義格式: public static final 數據類型 變量名 = 值;
class Company {
public static final String COMPANY_NAME = "紅後科技";
public static void method(){
System.out.println("一個靜態方法");
}
}
當想使用類的靜態成員時,不需要創建對象,直接使用類名來訪問即可。
System.out.println(Company.COMPANY_NAME); //打印“紅後科技”
Company.method(); // 調用一個靜態方法
注意:接口中的每個成員變量都默認使用public static final 修飾。
所有接口中的成員變量已是靜態常量,由於接口沒有構造方法,所以必須顯示賦值。可以直接用接口名訪問。
interface Inter {
public static final int COUNT = 100;
}
//訪問接口中的靜態變量
Inter.COUNT
匿名對象 匿名對象是指創建對象時,只有創建對象的語句,卻沒有把對象地址值賦值給某個變量。
已經存在的類:
public class Person{
public void eat(){
System.out.println();
}
}
創建一個普通對象:
Person p = new Person();
創建一個匿名對象:
new Person();
匿名對象的特點
創建匿名對象直接使用,沒有變量名。
new Person().eat() //eat方法被一個沒有名字的Person對象調用了。
匿名對象在沒有指定其引用變量時,只能使用一次。
new Person().eat(); 創建一個匿名對象,調用eat方法
new Person().eat(); 想再次調用eat方法,重新創建了一個匿名對象
匿名對象可以作爲方法接收的參數、方法返回值使用
class Demo {
public static Person getPerson(){
//普通方式
//Person p = new Person();
//return p;
//匿名對象作爲方法返回值
return new Person();
}
public static void method(Person p){}
}
class Test {
public static void main(String[] args) {
//調用getPerson方法,得到一個Person對象
Person person = Demo.getPerson();
//調用method方法
Demo.method(person);
//匿名對象作爲方法接收的參數
Demo.method(new Person());
}
}
內部類 將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱爲內部類。其他類也稱爲外部類。
在描述事物時,若一個事物內部還包含其他可能包含的事物,比如在描述汽車時,汽車中還包含發動機,這時發動機就可以使用內部類來描述。
class 汽車 { //外部類
class 發動機 { //內部類
}
}
內部類分爲成員內部類與局部內部類。定義內部類時,就是一個正常定義類的過程,同樣包含各種修飾符、繼承與實現關係等。 在內部類中可以直接訪問外部類的所有成員。
成員內部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行訪問
定義格式:class 外部類 {
修飾符 class 內部類 {
//其他代碼
}
}
訪問方式:外部類名.內部類名 變量名 = new 外部類名().new 內部類名();
局部內部類,定義在外部類方法中的局部位置。與訪問方法中的局部變量類似,可通過調用方法進行訪問。
定義格式:
class 外部類 {
修飾符 返回值類型 方法名(參數) {
class 內部類 {
//其他代碼
}
}
}
訪問方式:在外部類方法中,創建內部類對象,進行訪問匿名內部類 是創建某個類型子類對象的快捷方式。
格式:
new 父類或接口(){
//進行方法重寫
};
使用匿名對象的方式,將定義子類與創建子類對象兩個步驟由一個格式一次完成,。雖然是兩個步驟,但是兩個步驟是連在一起完成的。
匿名內部類如果不定義變量引用,則也是匿名對象。