1. 程式人生 > 其它 >TCP 的三次握手到底是在幹嘛 結束連結為什麼要握手4次?

TCP 的三次握手到底是在幹嘛 結束連結為什麼要握手4次?

  • 自動型別轉換

  把子類物件直接賦給父類引用叫做向上轉型,向上轉型可以自動轉換。

static class One {
    public void foo() {
        System.out.println("One");
    }
}
static class Two extends One {
    public void foo() {
        System.out.println("Two");
    }
    public void dosth(){
        System.out.println("Two again");
    }
}
public static void main(String[] args) throws Exception{ One t = new Two(); //向上轉型,即父類引用指向子類物件,此時子類物件的型別為父類的型別 t.foo(); t.dosth();//編譯錯誤 t = (Two)t; t.dosth();//編譯錯誤 ((Two) t).dosth();//編譯成功 }
  • 強制型別轉換

  把指向子類物件的父類引用賦給子類引用叫做向下轉型,要強制轉換。

One one = new Two();    //向上轉型,即父類引用指向子類物件,此時子類物件的型別為父類的型別
Two two = (Two)one;     //向下轉型,需強制轉換,編譯成功

One one2 = new One();
two = (Two)one2; //便衣成功,執行失敗。報錯資訊為:java.lang.ClassCastException: com.xxx.One cannot be cast to com.xxx.Two

  總結

  1. 父類引用可以指向子類物件,子類引用不能指向父類物件。把子類物件直接賦給父類引用叫做向上轉型,向上轉型不用強制轉型,如One o=new Two()。把指向子類物件的父類引用賦給子類引用叫做向下轉型,要強制轉型,如Two t = (Two)o。向上轉型會丟失子類特有的方法,但是子類overriding父類的方法,子類方法有效。
  2. 對於強制型別轉換,且是引用型別,如果是父類向子類轉換,這種只牽扯到引用名義型別的轉換,具體的記憶體沒有什麼變化。
  • 數值型別轉換
  1. 資料值型別按照範圍從小到大為:byte,short,char,int,long,float,double
  2. 滿足下列兩種要求將執行自動型別轉換:1.兩種型別是相容的;2.目的型別的範圍比來源型別大。例如int型別比所有byte合法型別大,因此不要求顯式強制型別轉換。對於數字型別,整型和浮點型都是彼此相容的,但是數字型別和字元型別和布林型別是不相容的,字元型別和布林型別也不是互相相容的。
  3. 自動型別轉換不能滿足所有的轉換需求,比如int型變數賦值給byte型變數,這種轉換不會自動進行,因為byte型比int型範圍小。為了完成兩種不相容型別轉換,需要用到強制型別轉換。
byte b;
int i = 257;
double d = 32.13;
b = (byte) i;
System.out.println("i and b = " + i + " " + b);
i = (int)d;
System.out.println("d and i = " + d + " " + i);
b = (byte)d;
System.out.println("d and b = " + d + " " + b);
byte e=(byte)130; 
System.out.println(e);
 
 
/*
* output
i and b = 257 1
d and i = 32.13 32
d and b = 32.13 32
-126
*/

short s = 1;
s= s + 1;//編譯錯誤
short s1 = 1;
s1 += 1;

//上述陷阱是s = s + 1,s + 1會隱式轉換為int型,把int型號賦給short,會造成型別缺失。而s1 += 1相當於s1 = (short)(s1 + 1)會把s1 + 1強制轉換為short型別,就不會報錯。

  • 包裝類之間轉換

  包裝類之間不支援強制型別轉換,需要呼叫Integer.valueOf()、Integer.parseInt()等方法。

  Tips: Integer.parseInt(String s)將會返回int常量。
     Integer.valueOf(String s)將會返回Integer型別,如果存在快取將會返回快取中已有的物件。即:如果s字串對應的整數值在 -128~127之間,則解析出的Integer型別的物件是同一個物件;如果s字串對應的整數值不在-128~127之間,則解析出的Integer型別的   物件不是同一個物件。