1,abstract:可以修飾類和方法。修飾後就變成了抽象方法,抽象類
(1)如果修飾類的話,此類必須被繼承使用,abstrcat最大程度的將子類的共性抽出來。abstract雖然不能生成對象,但可以聲明,作爲編譯時類型,final與abstract不能同時出現。
(2)一個有抽象方法的類,一定是抽象類,但一個抽象類的不一定有抽象方法。
(3)抽象類不可創建對象,但可以有構造函數(子類可以繼承)。
(4)子類繼承抽象類,必須實現其中的抽象方法,除非子類也是抽象類。
(5)abstract不可與private、static、final、native、synchronized
2.static
(1)作用:方便在沒有創建對象的情況下時調用(方法/變量)。只要在類加載了,就可以通過類名調用。
(2)在靜態方法中不能調用非靜態的成員變量或成員方法,但非靜態的方法可以訪問靜態的成員變量或方法。
(3)靜態變量:靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類加載的時候會被初始化。非靜態成員是對象所擁有,在創建對象的時候,存在多個副本,對象擁有的副本互不影響。
(4) static關鍵字還有一個比較關鍵的作用就是 用來形成靜態代碼塊以優化程序性能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。
(5)static是不允許用來修飾局部變量
題:public class Test extends Base{
static{
System.out.println("test static");
}
public Test(){
System.out.println("test constructor");
}
public static void main(String[] args) {
new Test();
}
}
class Base{
static{
System.out.println("base static");
}
public Base(){
System.out.println("base constructor");
}
}
base static test static base constructor test constructor
先加載類,再new 執行構造。
3,final
(1)修飾類:這個類不會被繼承,final類中的所有成員方法都會被隱式地指定爲final方法。
(2)修飾變量:對於一個基本類型的變量,一旦在初始化了之後就不能再改變。如果是引用類型的變量,在初始化之後便不能改變其引用,但是它指向的對象的內容是可變的。
(3)修飾方法:把方法鎖定,以防任何繼承類修改它的含義,。類的private方法會隱式地被指定爲final方法。
題:
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
結果:
0.4527538724400425
0.56876948705211
0.4132824472418981
0.56876948705211
可見final與static的區別。
4 this
(1)是一個引用,它指向自身的引用。一般在類的構造函數中使用,區分開形參和成員變量。
5.super:
(1)用來引用父類的成分。一種是引用被子類隱藏的父類成員,一種是引用父類的構造。
(2)可用super.成員變量或成員方法。如在父類未找到,則繼續向上尋找。
(3)在子類的構造函數中如沒有super方法,就會默認super()方法調父類構造。
(4)對於父類中包含有參數的構造方法,子類可以通過在自己的構造方法中使用super關鍵字來引用,而且必須是子類構造函數方法中的第一條語句。