this關鍵字
this是當前對象的引用,是運行期間當前對象自己。
可使用this明確的訪問當前對象的屬性或者方法,相似於「我」
this()能夠調用本類的其餘構造器,可使用構造器的重用簡化代碼的實現
this()必須寫在構造器的第一行!
1、java調用方法參照兩點:
1,方法簽名(方法名+參數列表)
2,就近原則:
好比 f('a',5) ---->f(int ,int)
f(double,int)
3,java參數的傳遞規則
基本類型:值傳遞
引用類型:地址傳遞
2、多態和重載
java使用方法的重載體現了多態的特徵
Person是Student的超類
Person stud = new Student();
編譯期類型爲Student()運行時類型爲Person(),這種現象叫動態綁定(也就是多態)
若是父類沒有無參構造器,就必須在子類中明確的指定父類的有參構造器。
因此建議每一個類都提供無參構造,減小繼承時候的麻煩。
-------------------------------------------------------------------package pack01;
public class Persion {
private int age;
private double height;
private double weight;
Persion(int age, double height, double weight){
this.age = age;
this.height = height;
this.weight = weight;
}
}
class Student extends Persion{
private int id;
Student(int age, double height, double weight, int id){
super(age, height, weight);
this.id = id;
}
}
-------------------------------------------------------------------
3、對象實例化過程
1,建立類以前,檢查類是否加載,若是沒有加載,先加載父類,再加載該類。
加載類:經過CLASSPATH找到.class文件,將硬盤上的.class文件加載到內存中
java採用按需加載:第一次用到就加載,只加載一次。
2,在內存堆中分配對象空間。遞歸分配全部父類和子類屬性空間。
默認自動初始化,初始化"0"值。
3,進行屬性的賦值。
4,遞歸調用父類的構造器。
5,調用本類的構造器。
4、訪問控制修飾符
類內 包內 子類 包外
1,public yes yes yes yes
2,protected yes yes yes
3,default yes yes
4,private yes
5、引用類型的轉換
向下轉換:小類型---->大類型 (自動轉換)
向上轉換:大類型---->小類型 (強制轉換)
6、靜態綁定和動態綁定
多態就是動態綁定
靜態綁定就是在Student對象中有2個屬性name,系統爲了加以區分,會爲同名屬性加一個標籤:將屬性標記
爲在棧內存中聲明的引用變量的類型,調用具體引用變量.屬性時,根據標籤去找,這種現象稱爲靜態綁定
7、javabeen規範
關於JavaBean規範:JavaBean丌是語法規範,是習慣性編程規範,用這個規範寫的類使用方便。
有時候JavaBean的類也稱爲:POJO 類(Plan Old Java Object)
簡化規範:
1) 必須有包(package)
2) Java類,具備無參數構造器
3) 有用getXxx() 和 setXxx() 聲明的Bean屬性
如:getName() 和 setName(String n) 聲明的Bean屬性爲:name, 不是否有實例變
量name無關
boolean類型的get方法能夠有兩種形式:getMarried() 戒者 isMarried()
4) 必須實現序列化接口(注:在學習IO的時候具體學習)
JDK提供的類幾乎都符合JavaBean規範。如:String類, 集合類
JavaBean最大的好處:「使用方便」
8、static關鍵字
static關鍵字修飾:屬性,方法,內部類,代碼塊。
1) static修飾的資源屬於類級別,是全體對象實例共享的資源
2) 靜態屬性
使用static修飾的屬性,屬於類的全體類的實例共享的變量
靜態屬性是在類的加載期間初始化的
使用類名.屬性訪問,如:System.out
3) 實例變量
屬於對象的屬性
使用對象.屬性訪問,如:person.name
9、finally關鍵字
1) final 修飾的類,不能再被繼承
Java 的String就是final類,不能被繼承!(面試題可能考到)
Math 是final類,不能被繼承!
Integer 、Long、Character等包裝類是final類,不能被繼承!
在實際項目開發中,原則上不容許使用final類!
Spring, Hibernate,Struts 2, 這些框架使用了"勱態繼承代理"技術,使用final的類會影
響"動態代理技術" 的實現.
2) final修飾的方法,不能再被覆蓋
在實際項目開發中,原則上不容許使用final方法! 緣由也是由於: 動態代理技術
3) final 修飾的變量,初始化之後不容許再修改了
final 局部變量
final 方法參數
final 的成員變量
4) final static -- Java使用final static修飾的變量做爲常量
通常要求常量名都有大寫字母
Java常量丌是const(c、c++中修飾常量的修飾符)
final修飾屬性表示「不能改」,static修飾屬性表示屬於類的「僅此一份」,注意區分
知識點:
final的局部變量,只能初始化不能改
final的方法參數,不能改
final的引用,引用指向丌能改,可是對象的屬性能夠改
10、抽象類
11、接口
接口中的屬性,默認是常量 public static final
接中的方法必定是public abstract的(默認,能夠不寫)
12、Object類
toString() ,hashCode(), equals()
toString()方法,常常由系統默認調用,是活勱當前對象的文本描述
Object默認返回值: 全限定名爲@hashCode
建議覆蓋爲:當前對象的文本描述
十3、equals方法:
用來比較兩個對象是否相等的方法
比較對象分爲兩種:「引用相等」與「對象相等」
equals在Object類中聲明,默認的比較規則是:比較引用(地址值)
建議覆蓋,實現對象的比較(比較對象的狀態,就是比較對象的數據)
覆蓋規則:
自反性:對於任何非空引用值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.
十4、hashCode()方法
hashCode()方法要與equals方法一同覆蓋(sun公司規定)
當兩個對象的equals比較爲true時,應具備相同的hashCode()值
當兩個對象equals比較爲false時,應具備不一樣的hashCode()值
hashCode()值要穩定(一致性),一個對象建立之後就不該該再變化
默認的hashCode()值是當前堆對象地址轉換的一個整數,這個整數不是內存地址!
通常使用OID值做爲hashCode的值
OID是對象的惟一編號,在項目中通常採用數據庫生成OID,也就是數據庫中的"主鍵"
十5、String字符串
字符串就是字符數組
字符串和字符數組能夠相互轉化
String str = new String(new char[]{'1','2','3'}); //字符數組轉化爲字符串
char[] chs = str.toCharArray(); //字符串轉化爲字符數組
-----------------------------------------------------------------------
package pack01;
public class Test {
public static void main(String[]args){
String str1 = "abc";
String str2 = str1;
str1 = str1 + "efg";
System.out.println(str1);
System.out.println(str2);
}
}
該程序的內存分配過程爲:
棧 堆
str1 -----------> "abc"
str2 -----------> "abc"
"efg" (堆中有"abc"和"efg")
"abcefg" (堆中有"abc"和"efg"和"abcefg")
str1 -----------> "abcefg" (堆中有"abc"和"efg"和"abcefg")
-----------------------------------------------------------------------
十6、正則表達式
用戶名規則 ^\w{8,10}$
【解釋】可出現8-10個單詞戒字符
電話號碼 +86 13912345678
^(\+86|0086)?\s?\d{11}$
【解釋】 "+"特殊字符,須要轉義"\+"表示"加號" \+86 表示出現"\+86"這幾個字符
(\+86|0086)? 表示"+86"戒"0086"出現0-1次 \s? 表示空白(空格)出現0-1次 \d{11} 表示出現11位數字
身份證號碼 ^\d{15}(\d{2}[0-9xX])?$
一個點的座標 ^\d+(,\s*|\s+)\d+$
【解釋】 \d+ 表示出現1個及以上的數字
(,\s*|\s+) 表示出現「逗號和0個及以上的空 白」戒「1個以上的空白」 \d+ 表示出現1個及以上的數字 ^\d+[,\s]\s*\d+$
答案規則(參考) ^\s*A?(\s+|,\s*)B?(\s+|,\s*)C?(\s+|,\s*)D?\s*$
【解釋】 \s* 可出現0-n個空格 A? A可出現0-1次 (\s+|,\s*)
"1個以上空白"戒"逗號,0個及以 上空白" D?\s*
日期 2011-01-30
^\d{4}-\d{2}-\d{2}$ ^\d{4}(-\d{2}){2}$
IP 地址 192.168.0.2
^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ ^\d{1,3}(\.\d{1,3}){3}$ ^(\d{1,3}\.){3}\d{1,3}$
「.」是特殊字符,須要轉義「\.」
十7、String和StringBuffer的區別
String = char[] + 操做(複製建立新對象)
StringBuilder = char[] + 對char[]的操做(處理當前數組內容)
區別StringBuilder內部的數組內容和長度可變。
String內部的數組內容和長度不可變。
----------------------------------------------------
----------------------------------------------------
StringBuilder
1) StringBuilder是變長字符序列
2) StringBuilder方法:append,insert ... 都返回當前 StringBuilder 對象自己的引用
3) 若是軟件須要大量字符串處理時候建議使用StringBuilder
4) String s = s1+s2; Java其實是以下代碼運行:
String s=new StringBuilder(s1).append(s2).toString();
5) String s = s1+s2+s3+s4; 被優化爲
String s = new StringBuilder(s1).append(s2).append(s3).append(s4).toString();
6) s += "a";會產生兩個新對象(StringBuilder, String)(筆試題)
StringBuilder buf=new StringBuilder(); buf.append("a"); buf.append("a");
7) StringBuffer 和 StringBuilder API幾乎同樣!
StringBuffer 是java早期提供的(JDK1.0),速度稍慢,線程安全 StringBuilder
是Java5 之後提供的(JDK5.0),速度快,非線程安全
因此對大量的字符串拼接使用StringBuilder.
若是對字符串性能有極高的要求,就用char[]
十8、ArrayList(1.2版本之後的)是使用變長數組算法實現的,ArrayList繼承自List
1,ArrayList和Vector的比較
Vector,現成安全,效率稍低,也是使用變長數組算法實現的,繼承自List接口。
ArrayList,線程不安全的,效率高速度快(如今較經常使用)
2,ArrayList和LinckedList的比較
LinkedList是採用雙向循環鏈表實現的List
ArrayList是採用變長數組算法實現的List
十9、散列表概念
1,容量 散列表中散列數組大小
2,散列運算 key->散列值(散列數組下標)的算法,如: "mm".hashCode()%10->8
3,散列桶 散列值相同的元素的 "線性集合"
4,加載因子 是散列數組加載率,通常小於75%性能比較理想
就是(元素數量/散列數組大小)如 如: 7/10 = 70%
5,散列查找 根據Key計算散列值,根據散列值(下標)找到
6,散列桶 在散列桶中順序比較Key,若是同樣,就返回value
散列表中Key不一樣,Value能夠重複
二10、HashMap
在ArrayList中查找Mac,順序查找,須要查找5次
在HashMap中(底層實現原理是散列表)查找Mac,通過散列運算,僅需1次java