1. 程式人生 > >java基礎瑣碎知識點

java基礎瑣碎知識點

1、java變數型別

類變數(靜態變數):在類中使用static關鍵字宣告,在構造方法,方法,語句塊以外。無論一個類建立了多少物件,類只擁有類變數的copy。靜態變數在程式開始的時候建立,在程式結束的時候銷燬。只能被靜態的方法呼叫。與例項變數類似,有預設的初始值。可以通過ClassName.ValueName直接呼叫。

例項變數:宣告在構造方法,方法,或者語句塊以外。例項變數在物件被建立的時候建立,在物件被銷燬的時候銷燬。例項變數至少被一個構造方法,方法或語句塊引用。使得外部能夠通過這些方式獲得例項變數的值。例項變數可以宣告在引用前,也可以宣告在引用後。例項變數是有預設值的,數值型別預設為0,布林型別預設為false,引用型別預設為null。例項變數可以使用訪問修飾符修飾。

區域性變數:宣告在構造方法,方法語句塊中的變數。在方法或者語句塊執行的時候建立,在執行完後會被銷燬。訪問修飾符不能用來修飾區域性變數,他們被建立在棧中。沒有預設值,所以一定初始化才能使用。

靜態變數屬於類,該類不生成物件就可以通過類名呼叫 靜態變數。只要程式載入了類的位元組碼就好被分配空間

例項變數屬於該類的物件,只有生成物件才能呼叫例項變數。必須建立了物件,才給分配空間

靜態方法只用呼叫靜態變數。非靜態方法既能呼叫靜態變數又能呼叫例項變數。

類的靜態資料成員被所有建立的物件共享,任何物件訪問靜態變數使用的都是同一個資料,同一塊記憶體的。無論哪個物件修改了靜態變數,對其他的物件來說,這個靜態變數已經變了。

2、java中的修飾符

1)訪問修飾符

預設訪問修飾符:可以用來修飾類,介面,方法,變數。預設的類,只能被本包中的其他類訪問到。預設的介面中的方法為public訪問型別,介面中的變數為public static final。

私有訪問修飾符——private:只能用來修飾變數,方法,構造方法。使用private修飾的只能被所屬類訪問。private不能修飾外部類和介面。這個變數用來保護不想被外部訪問到的變數和方法。可以通過提供的get,set方法來操作修改private修飾的變數。

公有訪問修飾符——public:可以修飾類,變數,構造方法,方法

受保護的訪問修飾符——protected:不能用來修飾外部類,和介面。能修飾內部類,變數,和方法。修飾的內部類,變數和方法能夠被本包中的其他類呼叫。

protected修飾的內部類,方法,變數只能被本包中的其他類呼叫,內被繼承該類的子類呼叫。

一個類中有方法被protected修飾,暫時把該類稱為基類。跟基類在同一個包中的類無論是不是該基類的子類,都能通過基類的例項化或者基類子類的例項化物件訪問到被protected修飾的方法。與基類不在同一個包中的基類的子類只能通過super關鍵字或者本子類的例項化訪問到protected修飾的方法。與基類不在同一個包中也不是改基類的子類,是沒有任何辦法呼叫到在基類中被protected修飾的方法的。

在父類中被宣告為protected的方法,在子類中可以被生命為public或者protected,不能宣告為:private

2)非訪問修飾符

延伸知識點:建構函式的作用是建立物件以及物件的初始化。建構函式在類的物件建立的時候就執行,普通的方法物件呼叫的時候才執行,建構函式只執行一次,普通的方法執行的次數取決於物件的呼叫。

子類繼承父類的時候,子類物件初始化的時候,父類的建構函式也需要執行。因為子類需要使用父類的屬性顯示或隱式的呼叫父類的構造方法。子類總至少有一個建構函式以super()開頭,可以是隱式的;至少有一個子類的建構函式開頭不是this();。子類建構函式可以呼叫本類的建構函式,間接呼叫父類的建構函式。

this();或者super();都是在jvm虛擬機器上構造出一個指定型別的物件。在一個建構函式內呼叫兩個別的建構函式表示建立了兩個物件,所以規定this();或者super();都需要放在建構函式的第一行。

在建構函式呼叫本類中別的建構函式時,this();或者super();都需要放在建構函式的第一行,所以一個建構函式內只能呼叫一個另外的建構函式。

this關鍵字:this();表示當前類的建構函式,這個方法只能放到構造方法的第一行,保證執行任何動作之前,物件已經初始化,建構函式只能被建構函式呼叫,保證物件只是初始化一次。

在普通方法中不用使用this();因為避免對本物件操作時,物件本身還未構建成功。如果在普通方法中想要呼叫構造方法,可以使用new一個物件的方法。

當成員變數與區域性變數重名時,在方法中使用this時,表示的是該方法所在類的成員變數(this表示當前物件自己)。當不使用this時以區域性變數為準

把自己當做引數傳遞時,也可以使用this(this當做當前引數進行傳遞)

遇到內部類或者匿名類,在內部類或匿名類中使用this表示的是該內部類或匿名類本身。如果想要呼叫外部類的方法或者變數可以:外部類名.方法名(靜態方法),外部類名.this.方法名(普通方法)

static 修飾符:static方法就是沒有this的。this表示的是物件,static變數或者方法是在類被載入的時候就被載入了,在物件建立前載入的。如果this放在static方法中編譯器會去找this代表的物件,但是沒有建立物件,找不到所以報錯。

static 修飾的表示類變數或者類方法,所以區域性變數不能使用static修飾。

在靜態方法中不能訪問非靜態變數,因為非靜態的變數是屬於物件的,靜態方法是在建立物件之前存在的。

final修飾符:final修飾的變數只能被賦值一次,重複賦值會報錯。final修飾的物件不能修改的,但是物件中的變數的值是可以修改的。被final修飾的方法能被子類繼承,但是不能被子類修改。被final修飾的類不能被繼承。

abstract修飾符:使用abstract修飾的類是抽象類,該類不能例項化物件,不能使用final和abstract同時修飾一個類,因為被final修飾的類不能被繼承,而抽象類只有被繼承才能例項化,才有用。兩者衝突。

抽象類中可以包含抽象方法和非抽象方法。但是一個類中包含了抽象方法,就一定是抽象類。因為抽象方法不被重寫就沒有用,它沒有實體。抽象方法的具體實現由子類提供

synchronized修飾符:被synchronized修飾的方法同一時間只能被一個執行緒訪問。

volatile修飾符:volatile修飾  的成員變數每次被執行緒訪問的時候,都會從記憶體中重新讀取該變數的值。當成員變數發生變化時,會強制的將變化後的值回寫至記憶體,所以所有的執行緒看到該變數都是相同的值。

不能再final修飾符前面使用volatile,因為final修飾的變數不能修改。

java方法中的可變引數:在具有可變長度的引數的方法中可以當做陣列使用。在呼叫發放中如何能和固定引數的方法匹配,也能夠和可變長度的方法匹配,則優先和固定引數的方法匹配。可變長度的引數放在方法引數的最後面,因為如果放大了前面,不知道什麼時候是對應的固定引數。每個方法只能有一個可變長度的引數,也是符合可變長度的方法引數放到最後面。

public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        test.print("hello");
        test.print("hello", null);
    }

不要讓空值威脅到可變長度的引數,不要隱藏實參型別

 public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        String[] strs = null;
        test.print("hello", strs);
    }