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