1. 程式人生 > >Java常見知識點

Java常見知識點

一,面向物件程式設計的四大特性及其含義?

面向物件是一種思想,即將世間萬物都視為物件。面向物件的四大基本特性分別是封裝,繼承,抽象和多型。

  • 封裝:封裝就是將類的具體細節不對外公開,只留一個指定的訪問的通道,這樣做就保證了這個類的獨立性和複用性
  • 繼承:這是一種複用機制,一個類可以繼承另一個類或者介面,那麼這個類就會有繼承的類或介面的非私有屬性和方法,提高了軟體的可重用性和可擴充套件性
  • 抽象:提取一些事物的主要資訊然後歸結為類,這個提取出來的類是一種模型,它還包含屬性和行為,對抽象出來的類例項化得到物件
  • 多型:編譯和執行的型別不一致就是多型,Java實現多型有三個必要條件:繼承、重寫、向上轉型
    新建一個Food類:
public class Food {

	public void aaa() {
		System.out.println("Food類的aaa方法");
		bbb();
	}
	
	public void bbb() {
		System.out.println("Food類的bbb方法");
	}
}

再建一個Apple類繼承Food類:

public class Apple extends Food{

	public void aaa(String a) {
		System.out.println("Apple類的aaa方法");
		bbb();
	}

	@Override
public void bbb() { System.out.println("Apple類的bbb方法"); } }

最後建一個測試類:

public class Run {

	public static void main(String[] args) {
		Food f = new Apple();
		f.aaa();
	}
}

執行結果:

Food類的aaa方法
Apple類的bbb方法

這個簡單的例子便實現了多型
Food f = new Apple();這句程式碼的意義是,先Food f 建立一個指向Food物件的引用,然後new Apple()呼叫Apple類的構造器,例項Apple類,然後讓這個指向Food類的引用 f 指向例項的Apple物件,由於Apple類是繼承Food類的,所以Apple類會向上轉型,Apple類中的aaa(String a) {}方法在Food類中沒有,所以會被捨棄,Food類中的bbb(){}方法在Apple類中被重寫,所以會被儲存

二,java中String、StringBuffer、StringBuilder的區別

1,是不是可變

  • String:String類中使用字元陣列儲存字串,因為有final修飾,所以是不可變的
    /** The value is used for character storage. */
    private final char value[];
  • StringBuffer和StringBuilder:StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元陣列儲存字串,可知這兩種物件都是可變的
    /**
     * The value is used for character storage.
     */
    char[] value;

2,執行緒是否安全

  • String:String中的物件是不可變的,也就可以理解為常量,顯然執行緒安全
  • StringBuffer對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是執行緒安全的
    @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

  • StringBuilder並沒有對方法進行加同步鎖,所以是非執行緒安全的

3,執行速度

StringBuilder > StringBuffer > String
String變數是常量,一旦建立就不可更改,所以每次對String變數的操作都是將當前的變量回收再重新建立物件,所以比較費時

4,試用範圍

  • String:適用於少量的字串操作的情況
  • StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況
  • StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況