1. 程式人生 > 其它 >Go語言之Goroutine與通道、異常處理

Go語言之Goroutine與通道、異常處理

  1. static關鍵字

  當宣告一個事物是static時,這個域或方法不會與包含它的那個類的任何物件例項關聯在一起。所以,即使未建立某個類的任何物件,也可以呼叫其static方法或者訪問其static域。 

  一個static欄位對每個類只有一份儲存空間,而非static欄位對每個物件有一個儲存空間。

  static方法沒有this的方法。

  2. 引用初始化的位置

  1)在定義物件的地方。即總能在構造器被呼叫之前被初始化

  2)在類的構造器中

  3)在正要使用這些物件之前,即惰性初始化。在生成物件不值得及不必要每次都生成物件的情況下,這種方式可以減少額外負擔。

  4)使用例項初始化  

public class Soap {
    private String s;
    Soap(){
        System.out.println("Soap()");
        s = "Constructed";
    }
    
    public String toString() {
        return s;
    }
}

public class Bath{
    private String // Initializing at point of definition
    s1 = "Happy",
    s2 = "Happy",
    s3, s4;
    
private Soap castille; private int i; private float toy; public Bath() { System.out.println("Inside Bath()"); s3 = "Joy"; toy = 3.14f; castille = new Soap(); } // Instance initialization: { i = 47;} public String tostring() { if(s4 == null
) // Delayed initialization: s4 = "Joy"; return "s1 = " + s1 + "\n" + "s2 = " + s2 + "\n" + "s3 = " + s3 + "\n" + "s4 = " + s4 + "\n" + "i = " + i + "\n" + "toy = " + toy + "\n" + "castille = " + castille + "\n"; } public static void main(String[] args) { Bath b = new Bath(); System.out.println(b); } }

  3. 為什麼需要RTTI(Run-Time Type Identification)

  下圖是一個典型的類層次結構圖,基類位於頂部,派生類向下擴充套件。程式碼只操縱對基類的引用。這樣,如果要新增一個新類,來擴充套件程式,就不會影響原有的程式碼。shape類中動態綁定了draw()方法,這樣客戶端程式設計師使用泛化的shape引用來呼叫draw(),即多型。shape物件實際執行什麼樣的程式碼,是由引用所指向的具體物件Circle、Square或者Triangle而決定的。如果大部分程式碼儘可能少的瞭解物件的具體型別,而只與物件家族中的一個通用表示打交道(在該例中是shape)。這樣的程式碼更容易些,易讀,易於維護。

  

abstract class Shape {
    void draw(){
        System.out.println(this + ".draw()");
    }
    abstract public String toString();
}
public class Circle extends Shape{
    public String toString(){ return  "Circle";}
}
public class Square extends Shape{
    public String toString(){ return  "Square";}
}
public class Triangle extends Shape{
    public String toString(){ return  "Triangle";}
}
public class Shapes {
    public static void main(String[] args) {
        List<Shape> shapeList = Arrays.asList(new Circle(), new Square(), new Triangle());
        for (Shape shape : shapeList)
            shape.draw();
    }
}

結果:

Circle.draw()
Square.draw()
Triangle.draw()

  4. 抽象類與介面

  僅有方法宣告而沒有方法體的方法稱為抽象方法。一個類包含一個或多個抽象方法,該類必須被限定為抽象的,即抽象類。抽象類中允許有普通方法。

  介面中的方法都是抽象的。

  5. Java泛型為什麼使用擦除?

  泛型型別只有在靜態型別檢查期間出現,在此之後,程式中的所有泛型型別都將被擦除,替換為它的非泛型上界。例如,list<T>擦除為list,普通的型別變數在未指定邊界的情況下,將被擦除為Object。泛型是Java SE5出現的功能。為了實現遷移相容性,每個類庫和應用程式必須與其他所有的部分是否使用了泛型無關。即它們必須不具備探測其他類庫是否使用了泛型的能力。