1. 程式人生 > >JavaSE複習——技術篇

JavaSE複習——技術篇

針對此次的java期末考試寫幾篇文,作為自己複習資料。

入門篇——定義概念

基礎篇——基礎知識

技術篇——對知識的深入理解


3.	Java的引數傳遞方式有兩種,地址傳遞和值傳遞,其中__複合資料__型別作為引數時為地址傳遞。

Java的簡單資料型別


資料型別

資料型別就是對記憶體位置的抽象表達。程式設計師可以利用多種資料型別:某些由程式語言定義,某些由外部庫定義,還有些則由程式設計師來定義。很多程式語言都依賴於特定的計算機型別和對資料型別屬性的具體編譯實現,比如word和integer資料型別的大小等。另一方面,Java的虛擬機器負責定義其內建資料型別的各方面內容。這就意味著不管Java虛擬機器(JVM)執行在何等低階的作業系統之上,資料型別的屬性都是完全一樣的。


簡單資料型別


           簡單資料型別是不能再簡化的、內建的資料型別,由程式語言定義,表示真實的數字、字元和整數。更大、更復雜的資料型別可以採用簡單資料型別的組合來定義。在大多數情況下,簡單資料型別都具有其硬體等價物。比方說,int簡單型別有時存放在32位硬體暫存器內。Java提供了幾類簡單資料型別表示數字和字元。
           簡單資料型別通常劃分為以下幾種類別:實數、整數、字元和布林值。這些類別中又包含了多種簡單型別。比如說,Java定義了兩種簡單型別:float和 double,它們都屬於實數類別,另外4種簡單型別:byte、short、int和long則都屬於整數類別。此外還有一種簡單型別char則歸於字元型別。布林值類別只有一種簡單型別:boolean。表A詳細列出了Java的簡單資料型別.

Java簡單資料型別表


 簡單型別 大小 範圍/精度 
 float 4 位元組 32位IEEE 754單精度 
 double 8 位元組 64位IEEE 754雙精度 
 byte 1位元組 -128到127 
 short 2 位元組 -32,768到32,767 
 int 4 位元組 -2,147,483,648到2,147,483,647 
 long 8 位元組 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807 
 char 2 位元組 整個Unicode字符集 
 boolean 1 位 True或者false 


        Java中的所有數字變數都是有符號的,Java不允許資料型別之間隨意的轉換。只有數字變數之間可以進行型別轉換。比如,boolean就不能轉換為其他資料型別,而且其他資料型別也不能轉換為boolean。
因為Java的簡單資料型別都經過準確定義,而且直接記憶體訪問也是不允許的,所以在Java語言中取消了sizeof運算子。
Java的簡單資料型別並不是物件。為了採用面向物件方式對待Java簡單資料型別,你需要首先用類封裝它們。


封裝類


          Java 還提供了Byte、Short、Boolean、Character、Integer、Double、Float和Long等內建的封裝類。這些封裝(wrapper)類提供了很直觀的實用方法。比如,Byte、Float, Integer、Long和Double類都具有doubleValue()方法,通過它可以把儲存在類的例項中的值轉換為Double型別。還有,所有的封裝類都提供了靜態的valueOf(String s)方法把給定的String轉換為對應的簡單型別。清單A的程式碼演示了這些封裝類的一些用法。


簡單資料型別初始化


在 Java語言中,簡單資料型別作為類的成員變數宣告時自動初始化為預設值,除非顯式地宣告。簡單資料型別為某一方法宣告區域性變數時不會自動地初始化而且會導致編譯器扔出類似以下的錯誤訊息“Variable x may not have been initialized.(x變數沒有初始化)”表B定義了Java簡單資料型別的預設值。
表B Java簡單資料型別的預設值
型別
預設值
boolean:false

Byte: 0

short:0

int:0

Long:0

Char:′u0000′

Float:0.0

double:0.0


Java簡單資料型別的預設初始值


     清單B 中的程式碼顯示所有的Java簡單資料型別都用做了Initialization類的成員變數。該例還顯示Initialization類的構造器中區域性聲明瞭一個int變數。在不修改以上程式碼的情況下,編譯器會在對以上程式碼進行編譯的時候扔出錯誤。
一旦引發問題的程式碼行(那些引用未初始化變數導致錯誤發生的程式碼)被刪除或者註釋掉。程式成功編譯和執行之後就會顯示以下的結果:
byte: 0
short: 0
int: 0
long: 0
float: 0.0
double: 0.0
char: 0
boolean: false
    我們還可以顯式地初始化成員變數為其他值,如以下程式碼所示:
byte b = 5;
short s = 123;
int i = 1234;
long l = 12345;
float f = 123.45f;
double d = 12345.678;
char c = ′A′;
boolean z = true;


小結

       Java定義了全套簡單資料型別。此外,Java取消了其他變成語言中的硬體和編譯器依附,允許程式設計師把注意力轉移到其他問題上來。在下一篇文章裡,我們將繼續討論某些經常用到的、Java定義的複雜資料型別,同時瞭解下如何利用它們來處理典型的程式設計問題。


Java的複雜資料型別


索引


      同簡單資料型別的定義一樣,Java虛擬機器(JVM)還定義了索引(reference)這種資料型別。索引型別可以“引用”變數,由於Java沒有明確地定義指標型別,所以索引型別可以被認為就是指向實際值或者指向變數所代表的實際值的指標。一個物件可以被多於一個以上的索引所“指”。JVM從不直接對物件定址而是操作物件的索引。
索引型別分成三種,它們是:類(class)、介面(interface)和陣列(array)。索引型別可以引用動態建立的類例項、普通例項和陣列。索引還可以包含特殊的值,這就是null 索引。null 索引在執行時上並沒有對應的型別,但它可以被轉換為任何型別。索引型別的預設值就是null。



     類(Class)指的是定義方法和資料的資料型別。從內部來看,JVM通常把class型別物件實現為指向方法和資料的一套指標。定義class型別的變數只能引用類的例項或者null ,如以下程式碼所示:
MyObject anObject = new MyObject(); // 合法
MyObject anotherObject = null; // 合法
MyObject stillAnotherObject = 0; // 非法


介面


      介面(interface)好比一種模版,這種模版定義了物件必須實現的方法,其目的就是讓這些方法可以作為介面例項被引用。介面不能被例項化。類可以實現多個介面並且通過這些實現的介面被索引。介面變數只能索引實現該介面的類的例項。比方說,假設我們定義了一個介面,名字是Comparable ,同時還定義了一個類SortItem,這個類實現了介面Comparable,那麼我們可以編寫以下的定義程式碼:
Comparable c = new SortItem();
假如Comparable 介面定義了一個方法: public void compare(Comparable item), 那麼SortItem 類就必須提供compare 方法的實現,如以下程式碼所示:
public class SortItem implements Comparable
{
public void compare(Comparable item)
    {
         ...method implementation here
}

}


陣列


 Java陣列(array)是動態建立的索引物件,這一點和類非常相似,此外,同類一樣,陣列只能索引陣列的例項或者null ,如以下程式碼所示:
    int[] myIntArray = new int[5];
    int[] anotherIntArray = null;
 陣列是Object類的繼承,這樣,Object類的所有方法都可以被陣列呼叫。陣列物件由元素組成。元素的數目也可以為0,在這種情況下稱做陣列為空。所有的陣列都是從0開始對元素編號的,這意味著陣列內的第1個元素的索引編號是數字0。所有對陣列元素的訪問都會在執行時上接受檢查,如果試圖使用編號小於 0或者大於陣列長度來索引元素就會產生ArrayIndexOutOfBoundsException異常並被扔出。
陣列的元素按整型值索引,如以下程式碼所示:
    int[] myIntArray = { 9, 5, 6 };
    int int1 = myIntArray[0];
    int int2 = myIntArray[1];
    int int3 = myIntArray[2];
陣列物件的長度是不變的。為了改變陣列變數的長度,你必須建立另一個數組並賦給變數,如以下程式碼所示:
    int[] myIntArray = { 9, 5, 6 };
    System.out.println("myIntArray length = " +myIntArray.length); // 輸出結果是3
    myIntArray = new int[] { 3, 6, 4, 2, 8 };
    System.out.println("myIntArray length = " +myIntArray.length); // 輸出結果是5

文章出處:飛諾網(www.diybl.com):http://www.diybl.com/course/4_webprogram/jsp/jsp_js/20090304/157777.html

 

其中複雜資料型別作為引數時利用的是  地址傳遞

1、基本型別作為引數傳遞時,是傳遞值的拷貝,無論你怎麼改變這個拷貝,原值是不會改變的
2、物件作為引數傳遞時,是把物件在記憶體中的地址拷貝了一份傳給了引數。

參考文章:

https://www.cnblogs.com/hpyg/p/8005599.html

 

4.閱讀程式段,回答問題:
public class ClassA{
  public void method1(int i){}
  public void method2(int i){}
  public static void method3(int i){}
  public static void method4(int i){}
}
public class  ClassB extends ClassA{
  public static void method1(int i){}
  public void method2(int i){}
  public void method3(int i){}
  public static void method4(int i){}
}
ClassB中(method1、method2、method3、method4)四個方法,方法 
  _method2_______覆蓋了父類方法;方法___method4_____ 隱藏了父類方法。

參考文章:

https://www.cnblogs.com/shakinghead/p/7445831.html

子類繼承父類後,父類的屬性和靜態方法並沒有被子類抹去,通過相應的引用可以訪問的到。但是在子類中不能顯示地看到,這種情況就稱為隱藏

子類繼承父類後,父類的非靜態方法被子類重寫後覆蓋上去,通過相應的引用也訪問不到了(除非建立父類的物件來呼叫)。這種情況稱為覆蓋

總結一下,就是,子類繼承父類後:

父類的成員變數只會被隱藏,而且支援交叉隱藏(比如靜態變數被非靜態變數隱藏)。父類的靜態方法只會被靜態方法隱藏,不支援交叉隱藏。父類的非靜態方法會被覆蓋,但是不能交叉覆蓋。

17、給定下列表達式
  Integer I= new Integer(42);
  Long  L= new Long(42);
  Double D= new Double(42.0);
則下列表達式輸出為true的是__D___
(A) (I==L)  (B)  (I==D)   (C) (D==L)   (D)  (I.equals (D))

這道題就是錯題,直接上一道完整的正確的題。

之前的說法

 ABC不同型別使用 == 編譯出錯

DEF中包裝類使用equals會先判斷是否instance,不是的話直接返回false

   (用instanceof判斷傳入的物件和this是不是一個類的物件)

詳解:

 均非包裝類的測試