java学习笔记(3)——面向对象
this關(guān)鍵字
this是當(dāng)前對象的引用,是運行期間當(dāng)前對象本身。
可以使用this明確的訪問當(dāng)前對象的屬性或者方法,類似于“我”
this()可以調(diào)用本類的其他構(gòu)造器,可以使用構(gòu)造器的重用簡化代碼的實現(xiàn)
this()必須寫在構(gòu)造器的第一行!
一、java調(diào)用方法參照兩點:
1,方法簽名(方法名+參數(shù)列表)
2,就近原則:
比如 ?f('a',5) ---->f(int ,int)
f(double,int)
3,java參數(shù)的傳遞規(guī)則
基本類型:值傳遞
引用類型:地址傳遞
二、多態(tài)和重載
java使用方法的重載體現(xiàn)了多態(tài)的特征
Person是Student的超類
Person stud = new Student();
編譯期類型為Student()運行時類型為Person(),這種現(xiàn)象叫動態(tài)綁定(也就是多態(tài))
如果父類沒有無參構(gòu)造器,就必須在子類中明確的指定父類的有參構(gòu)造器。
所以建議每個類都提供無參構(gòu)造,減少繼承時候的麻煩。
-------------------------------------------------------------------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;
}
}
-------------------------------------------------------------------
三、對象實例化過程
1,創(chuàng)建類之前,檢查類是否加載,如果沒有加載,先加載父類,再加載該類。
? 加載類:通過CLASSPATH找到.class文件,將硬盤上的.class文件加載到內(nèi)存中
? java采用按需加載:第一次用到就加載,只加載一次。
2,在內(nèi)存堆中分配對象空間。遞歸分配所有父類和子類屬性空間。
? 默認(rèn)自動初始化,初始化"0"值。
3,進(jìn)行屬性的賦值。
4,遞歸調(diào)用父類的構(gòu)造器。
5,調(diào)用本類的構(gòu)造器。
四、訪問控制修飾符
類內(nèi) 包內(nèi) 子類 包外
1,public ? yes yes yes yes
2,protected yes yes yes
3,default yes yes
4,private yes
五、引用類型的轉(zhuǎn)換
向下轉(zhuǎn)換:小類型---->大類型 ?(自動轉(zhuǎn)換)
向上轉(zhuǎn)換:大類型---->小類型 ?(強制轉(zhuǎn)換)
六、靜態(tài)綁定和動態(tài)綁定
多態(tài)就是動態(tài)綁定
靜態(tài)綁定就是在Student對象中有2個屬性name,系統(tǒng)為了加以區(qū)分,會為同名屬性加一個標(biāo)簽:將屬性標(biāo)記
為在棧內(nèi)存中聲明的引用變量的類型,調(diào)用具體引用變量.屬性時,根據(jù)標(biāo)簽去找,這種現(xiàn)象稱為靜態(tài)綁定
七、javabeen規(guī)范
關(guān)于JavaBean規(guī)范:JavaBean丌是語法規(guī)范,是習(xí)慣性編程規(guī)范,用這個規(guī)范寫的類使用方便。
有時候JavaBean的類也稱為:POJO 類(Plan Old Java Object)
簡化規(guī)范:?
1) ?必須有包(package)?
2) ?Java類,具有無參數(shù)構(gòu)造器?
3) ?有用getXxx() 和 setXxx() 聲明的Bean屬性?
如:getName() 和 setName(String n) 聲明的Bean屬性為:name, 不是否有實例變
量name無關(guān)?
boolean類型的get方法可以有兩種形式:getMarried() 戒者 isMarried()?
4) ?必須實現(xiàn)序列化接口(注:在學(xué)習(xí)IO的時候具體學(xué)習(xí))?
?
JDK提供的類幾乎都符合JavaBean規(guī)范。如:String類, ?集合類?
JavaBean最大的好處:“使用方便”
八、static關(guān)鍵字
static關(guān)鍵字修飾:屬性,方法,內(nèi)部類,代碼塊。
1) ?static修飾的資源屬于類級別,是全體對象實例共享的資源?
2) ?靜態(tài)屬性?
使用static修飾的屬性,屬于類的全體類的實例共享的變量?
靜態(tài)屬性是在類的加載期間初始化的?
使用類名.屬性訪問,如:System.out?
3) ?實例變量?
屬于對象的屬性?
使用對象.屬性訪問,如:person.name
九、finally關(guān)鍵字
1) ?final 修飾的類,不能再被繼承?
Java 的String就是final類,不能被繼承!(面試題可能考到)?
Math 是final類,不能被繼承!?
Integer 、Long、Character等包裝類是final類,不能被繼承!?
在實際項目開發(fā)中,原則上不允許使用final類!?
Spring, Hibernate,Struts 2, 這些框架使用了"勱態(tài)繼承代理"技術(shù),使用final的類會影
響"動態(tài)代理技術(shù)" 的實現(xiàn).?
2) ?final修飾的方法,不能再被覆蓋?
在實際項目開發(fā)中,原則上不允許使用final方法! 原因也是因為: 動態(tài)代理技術(shù)?
3) ?final 修飾的變量,初始化以后不允許再修改了?
final 局部變量?
final 方法參數(shù)?
final 的成員變量
4) ?final static -- Java使用final static修飾的變量作為常量?
一般要求常量名都有大寫字母?
Java常量丌是const(c、c++中修飾常量的修飾符)
final修飾屬性表示“不能改”,static修飾屬性表示屬于類的“僅此一份”,注意區(qū)分?
知識點:?
final的局部變量,只能初始化不能改?
final的方法參數(shù),不能改?
final的引用,引用指向丌能改,但是對象的屬性可以改
十、抽象類
十一、接口
接口中的屬性,默認(rèn)是常量 public static final?
接中的方法一定是public abstract的(默認(rèn),可以不寫)
十二、Object類
toString() ,hashCode(), equals()
toString()方法,經(jīng)常由系統(tǒng)默認(rèn)調(diào)用,是活勱當(dāng)前對象的文本描述?
Object默認(rèn)返回值: ?全限定名為@hashCode?
建議覆蓋為:當(dāng)前對象的文本描述
十三、equals方法:
用來比較兩個對象是否相等的方法
比較對象分為兩種:“引用相等”與“對象相等”
equals在Object類中聲明,默認(rèn)的比較規(guī)則是:比較引用(地址值)
建議覆蓋,實現(xiàn)對象的比較(比較對象的狀態(tài),就是比較對象的數(shù)據(jù))
覆蓋規(guī)則:
自反性:對于任何非空引用值x, x.equals(x) 都應(yīng)返回true.
對稱性:對于任何非空引用值x 和 y當(dāng)且僅當(dāng) y.equals(x)返回true時, x.equals(y)
才應(yīng)返回true.
傳遞性:對于任何非空引用值 x,y 和 z,如果x.equals(y)返回true,并且y.equals(z)返回
true, 那么x.equals(z)應(yīng)返回true.
一致性:對任何非空引用值x和y,多次調(diào)用x.equals(y)始終返回true或始終返回false.
十四、hashCode()方法
hashCode()方法要與equals方法一同覆蓋(sun公司規(guī)定)
當(dāng)兩個對象的equals比較為true時,應(yīng)具有相同的hashCode()值
當(dāng)兩個對象equals比較為false時,應(yīng)具有不同的hashCode()值
hashCode()值要穩(wěn)定(一致性),一個對象創(chuàng)建以后就不應(yīng)該再變化
默認(rèn)的hashCode()值是當(dāng)前堆對象地址轉(zhuǎn)換的一個整數(shù),這個整數(shù)不是內(nèi)存地址!
一般使用OID值作為hashCode的值
OID是對象的唯一編號,在項目中一般采用數(shù)據(jù)庫生成OID,也就是數(shù)據(jù)庫中的"主鍵"
十五、String字符串
字符串就是字符數(shù)組
字符串和字符數(shù)組可以相互轉(zhuǎn)化
String str = new String(new char[]{'1','2','3'}); ? //字符數(shù)組轉(zhuǎn)化為字符串
char[] chs = str.toCharArray(); //字符串轉(zhuǎn)化為字符數(shù)組
-----------------------------------------------------------------------
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);
}
}
該程序的內(nèi)存分配過程為:
棧 ? ? ? 堆
str1 ?-----------> "abc"
str2 ?-----------> "abc"
"efg" (堆中有"abc"和"efg")
"abcefg" (堆中有"abc"和"efg"和"abcefg")
str1 ?-----------> "abcefg" ?(堆中有"abc"和"efg"和"abcefg")
-----------------------------------------------------------------------
十六、正則表達(dá)式
用戶名規(guī)則 ^\w{8,10}$
【解釋】可出現(xiàn)8-10個單詞戒字符
電話號碼 +86 13912345678
^(\+86|0086)?\s?\d{11}$?
【解釋】 "+"特殊字符,需要轉(zhuǎn)義"\+"表示"加號" \+86 表示出現(xiàn)"\+86"這幾個字符?
(\+86|0086)? 表示"+86"戒"0086"出現(xiàn)0-1次 \s? 表示空白(空格)出現(xiàn)0-1次 \d{11} 表示出現(xiàn)11位數(shù)字
身份證號碼 ^\d{15}(\d{2}[0-9xX])?$
一個點的坐標(biāo) ^\d+(,\s*|\s+)\d+$
【解釋】 \d+ 表示出現(xiàn)1個及以上的數(shù)字?
(,\s*|\s+) 表示出現(xiàn)“逗號和0個及以上的空 白”戒“1個以上的空白” \d+ 表示出現(xiàn)1個及以上的數(shù)字 ^\d+[,\s]\s*\d+$
答案規(guī)則(參考) ^\s*A?(\s+|,\s*)B?(\s+|,\s*)C?(\s+|,\s*)D?\s*$
【解釋】 \s* 可出現(xiàn)0-n個空格 A? A可出現(xiàn)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}$?
“.”是特殊字符,需要轉(zhuǎn)義“\.”
十七、String和StringBuffer的區(qū)別
String = char[] + 操作(復(fù)制創(chuàng)建新對象)
StringBuilder = char[] + 對char[]的操作(處理當(dāng)前數(shù)組內(nèi)容)
區(qū)別StringBuilder內(nèi)部的數(shù)組內(nèi)容和長度可變。
String內(nèi)部的數(shù)組內(nèi)容和長度不可變。
----------------------------------------------------
----------------------------------------------------
StringBuilder
1) StringBuilder是變長字符序列
2) StringBuilder方法:append,insert ... 都返回當(dāng)前 StringBuilder 對象本身的引用
3) 如果軟件需要大量字符串處理時候建議使用StringBuilder
4) String s = s1+s2; Java實際上是如下代碼運行:
? String s=new StringBuilder(s1).append(s2).toString();
5) String s = s1+s2+s3+s4; 被優(yōu)化為
? String s = new StringBuilder(s1).append(s2).append(s3).append(s4).toString();
6) s += "a";會產(chǎn)生兩個新對象(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[]
十八、ArrayList(1.2版本以后的)是使用變長數(shù)組算法實現(xiàn)的,ArrayList繼承自List
1,ArrayList和Vector的比較
Vector,現(xiàn)成安全,效率稍低,也是使用變長數(shù)組算法實現(xiàn)的,繼承自List接口。
ArrayList,線程不安全的,效率高速度快(現(xiàn)在較常用)
2,ArrayList和LinckedList的比較
LinkedList是采用雙向循環(huán)鏈表實現(xiàn)的List
ArrayList是采用變長數(shù)組算法實現(xiàn)的List
十九、散列表概念
1,容量 散列表中散列數(shù)組大小
2,散列運算 key->散列值(散列數(shù)組下標(biāo))的算法,如: "mm".hashCode()%10->8
3,散列桶 散列值相同的元素的 "線性集合"
4,加載因子 是散列數(shù)組加載率,一般小于75%性能比較理想
就是(元素數(shù)量/散列數(shù)組大小)如 如: 7/10 = 70%
5,散列查找 根據(jù)Key計算散列值,根據(jù)散列值(下標(biāo))找到
6,散列桶 在散列桶中順序比較Key,如果一樣,就返回value
散列表中Key不同,Value可以重復(fù)
二十、HashMap
在ArrayList中查找Mac,順序查找,需要查找5次
? 在HashMap中(底層實現(xiàn)原理是散列表)查找Mac,經(jīng)過散列運算,僅需1次
轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3243939.html
總結(jié)
以上是生活随笔為你收集整理的java学习笔记(3)——面向对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java_01_Java读取Proper
- 下一篇: POJ 1654 Area 凸包面积