面向對象已講解知識點大綱:
- 類
對象
引用
- 方法
- 堆棧方法區(記憶體)
- 構造方法
- 方法的重載
- 私有
- 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編碼
按照指定的編碼表 将目前的字元串打碎(還原)為位元組數組,并傳回