天天看點

java se day12 火推

面向對象已講解知識點大綱:

-   類
    對象
    引用


-   方法

-   堆棧方法區(記憶體)

-   構造方法

-   方法的重載

-   私有

-   this

-   靜态

-   單例設計模式

-   繼承

-   權限修飾符

-   多态

-   抽象類

-   接口

-   内部類
           

Object 類

p1 == p2

p1.xx(p2);
           
equals 重點
equals 方法在非空對象引用上實作相等關系: 

自反性:對于任何非空引用值 x,x.equals(x) 都應傳回 true。 
對稱性:對于任何非空引用值 x 和 y,當且僅當 y.equals(x) 傳回 true 時,x.equals(y) 才應傳回 true。 
傳遞性:對于任何非空引用值 x、y 和 z,如果 x.equals(y) 傳回 true,并且 y.equals(z) 傳回 true,那麼 x.equals(z) 應傳回 true。 
一緻性:對于任何非空引用值 x 和 y,多次調用 x.equals(y) 始終傳回 true 或始終傳回 false,前提是對象上 equals 比較中所用的資訊沒有被修改。 
對于任何非空引用值 x,x.equals(null) 都應傳回 false。 



package cn.xdl.demo1;

public class Person {

    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean equals(Object obj) {
        if(obj==null) {
            return false;
        }
        if(this==obj) {
            //先判斷位址是否相等, 位址相等表示是同一個對象, 傳回為true
            return true;
        }
        //記憶體位址不同 , 判斷obj的類型, 是否與目前類型相同
        if(obj instanceof Person) {
            //類型相同時, 我們比較屬性的值是否相同
            Person p = (Person) obj;
            if(p.age != this.age) {
                //年齡不相同
                return false;
            }
            //位址不同, 類型相同, 年齡相同 ,接下來判斷姓名
            if(!p.name.equals(this.name)) {
                //姓名不同
                return false;
            }
            //位址不同, 類型相同, 年齡相同 ,姓名相同
            return true;

        }else {
            //類型不同, 無法比較 , 傳回false 
            return false;
        }
    }

}
           
HashCode()方法
這個方法來自Object類, 傳回一個int值, 這個方法是為了提高哈希表的性能 !


    一般與Equals方法一起使用 !


規範要求: 

    1.  一緻性 , 同一個對象, 屬性不改變的情況下,  傳回的hashCode值應該固定 !

    2.  相同的兩個對象, hashCode值應該一緻 !

    3.  hashCode值, 不是用來判斷對象是否相同的根據, hashCode值相同, 對象不一定相等!  不過在設計代碼時, 我們建議, hashCode值與equals判斷的結果保持一緻 !
           

toString方法

用于傳回對象的字元串表示形式 !  一般用于對象資料的檢視與列印 !

System.out.println方法傳入對象時, 其實自動調用的是 對象的toString方法
           
clone 克隆 (了解)
用于對象的克隆操作

這個方法 由Object實作 !  

我們需要添加克隆标記(實作Cloneable接口)



這個方法的使用 , 存在一些限制,  
預設情況下, 一個對象是無法進行克隆的 ,需要給這個對象的類型, 添加一個可被克隆的标記 !


案例: 

    Person p3 = (Person) p1.clone();
    System.out.println(p3);
    System.out.println(p1);
    System.out.println(p3==p1);
    System.out.println(p3.equals(p1));
           

基本資料類型與包裝類

java.lang.Integer   int

java.lang.Long      long

java.lang.Double    double

java.lang.Character char

java.lang.Boolean   boolean

java.lang.Byte      byte

java.lang.Float     float

java.lang.Short     short
           

基本資料類型與 包裝類如何轉換(了解)

什麼是裝箱? 
    是将一個基本資料類型轉換為包裝類對象的過程!

什麼是拆箱?
    是将一個包裝類的對象轉換為基本資料類型的過程!
           
jdk1.5之前:
需要手動拆箱, 和 手動裝箱

int a = 10;
//裝箱操作
    Integer b = Integer.valueOf(a);
    Integer b2 = new Integer(a);

//拆箱操作
    int c = b.intValue();


例如:  兩個Integer 在早期進行加法運算時: 

    Integer a =  new Integer(10);

    Integer b =  new Integer(20);

    int sum = a.intValue()+b.intValue();

    Integer sumI = new Integer(sum);
           
jdk1.5之後:
編譯器, 幫我們 完成了 自動拆箱 和 自動裝箱


    Integer a = 10;
    Integer b = 20;
    Integer sum = a+b;
           
常用方法與屬性: 重點
MAX_VALUE : 全局常量, 表示目前包裝類型的最大值
           
字元串轉換資料類型


-   通過parseXXX

    int parseInt(String text): 

    這個方法,  用來将一個字元串的數字, 轉換為Integer類型

    有時我們經常從網絡, 使用者 ,資料庫等, 讀取一些字元串格式的資料, 有可能這些資料是整型的 , 可以通過parseXXX将其轉換為對應的類型

-   構造方法

    new Integer(String text);

轉換格式 會出現錯誤:  
    NumberFormatException  數字格式化異常 
           

String

特性
-   常量池中重複利用

    因為字元串經常在程式中出現 , 當編寫了一個字元串後 , 這個字元串會被還存在常量池中, 如果重複出現相同字元串, 則使用同一塊記憶體中的對象 !

    如果重複出現的字元串 是 通過new開辟的空間, 則表示顯式指定新空間進行字元串的存儲, 就不會拿來重複利用 !

-   String的值無法改變

    String類型的值, 在記憶體空間中一經确定, 字元序列是無法改變的! 進行拼接字元串, 需要舍棄原有字元串 , 開辟新的空間進行存儲 !

    是以不建議, 進行過多的拼接字元串操作 !

    String a = "";
    for(int i=1;i<=100;i++){
        a = a+i;
    }
           

轉義字元 \

将原本在Java中具備特殊含義的字元, 轉換為布局含義的普通字元
String text =  "他就是"董飛"";
上述的代碼出現了問題, 引号再Java中具備特殊的含義: 

添加轉義字元後: 

    String text =  "他就是\"董飛\"";
    輸出的結果為: 他就是"董飛"
           
又來了一個問題,  

String text = "他還是\董飛"

我們可以通過轉義字元, 将另一個轉義字元轉換為普通字元 !
           

通過轉義字元, 可以轉化的文本以及含義:

\u+4個數字 : unicode編碼 !

\\          : 将轉義字元轉換為普通字元
\"          : 将雙引号轉換為普通字元
\r          : 回車
\n          : 換行
\t          : 制表符 , 橫向進入下一個單元格

\b          :  倒退(了解)
\f          : 走紙換頁(了解)

換行符再不同的作業系統下 有不用的寫法: 

再Mac os 裡換行使用 \n

在Unix 裡使用 \r

再windows使用 \r\n 
           

String常用方法

-   equals :  (重點(*****))

    比較的規則:  

        擷取到兩個字元串中的字元數組 ,  對兩個字元數組中的每一個元素進行比較, 如果都相同, 則傳回true; 


源碼如下: 

 public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
           
6個基本方法: 


    //一個字元串
    String text = "  abcd1ABCD  ";
    //1.    将字元串中的所有字元轉換為小寫并傳回(重點(*))
    System.out.println(text.toLowerCase());
    //2.    将字元串中的所有字元轉換為大寫并傳回(重點(*))
    System.out.println(text.toUpperCase());
    //3.    去除字元串中的前後空白
    System.out.println(text.trim());(重點(*))
    //4.    判斷字元串是否以某字元串開頭
    System.out.println(text.startsWith(" "));(重點(*))
    //5.    判斷字元串是否以某字元串結尾
    System.out.println(text.endsWith("D"));(重點(***))
    //6.    擷取字元串的長度(字元序列的長度, 也就是字元串中字元數組的長度)(重點(*****))
    System.out.println(text.length());
           
(重點(***))
indexOf : 用來查找一個字元 或 字元串 在 目前字元串中的位置 !

四個方法的重載: 

    -   
        參數1: char類型的參數  : 要查找的字元
        從左至右查找一個字元在字元串中的位置
    -   
        參數1.    char類型的參數,  
        參數2.    int類型的 , 表示開始索引 

        從參數2的位置向右查找一個字元的位置

    - 
        參數1.    String類型的參數: 要查找的字元串
        從左至右查找一個字元串在字元串中的位置

    -   
        參數1.    String類型的參數: 要查找的字元串
        參數2.   int類型的 , 表示開始的索引
        從指定的開始位置(參數2) , 向右查找一個字元串的位置 !
查找的結果:  

    1. 從左至右 查找到的第一個比對的字元或字元串的下标!

    2.  如果查詢不到 , 傳回-1;
           
(熟悉))
lastIndexOf : 用來查找一個字元 或 字元串 在 目前字元串中的位置 !(反向查找)

四個方法的重載: 

    -   
        參數1: char類型的參數  : 要查找的字元
        從右至左查找一個字元在字元串中的位置
    -   
        參數1.    char類型的參數,  
        參數2.    int類型的 , 表示開始索引 

        從參數2的位置向左查找一個字元的位置

    - 
        參數1.    String類型的參數: 要查找的字元串
        從右至左查找一個字元串在字元串中的位置

    -   
        參數1.    String類型的參數: 要查找的字元串
        參數2.   int類型的 , 表示開始的索引
        從指定的開始位置(參數2) , 向左查找一個字元串的位置 !
查找的結果:  

    1.  從右至左 查找到的第一個比對的字元或字元串的下标!

    2.  如果查詢不到 , 傳回-1;
           
(重點(**))
char charAt(int index)

參數1. 要擷取字元的索引

從一個字元串中 取出指定索引下的字元, 并傳回
           
(重點(***))
String substring : 從一個字元串中截取其中一部分 并傳回

方法存在兩個重載方法: 


    - 
        參數1.  截取的開始位置(包含)

    表示從指定的開始位置截取到字元串的結尾 

    -   
        參數1. 截取的開始位置(包含)
        參數2. 截取的結束位置(不包含)

    表示從指定的開始位置 截取到 指定的結束位置!



案例: 

    String text = "床前明月光,玻璃好上霜,要不及時擦,整不好得髒";
    String newText = text.substring(5);
    System.out.println(newText);
    String newText2 = text.substring(5,text.length());
    System.out.println(newText2);
           
(重點(*))
byte[] getBytes()

    存在兩個方法的重載:

    -   
        沒有參數清單 
        按照目前系統的預設編碼表 将目前的字元串打碎(還原)為位元組數組,并傳回

    -   
        參數1. 指定的編碼表的名稱()
            可以填入:  
                <1> : iso-8859-1 : 純英文編碼
                <2> : gbk        : 簡體中文編碼
                <3> : gb2312     : 簡體中文編碼
                <4> : utf-8      : unicode編碼
        按照指定的編碼表 将目前的字元串打碎(還原)為位元組數組,并傳回