日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java学习笔记(3)——面向对象

發布時間:2024/1/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java学习笔记(3)——面向对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

this關鍵字
this是當前對象的引用,是運行期間當前對象本身。
可以使用this明確的訪問當前對象的屬性或者方法,類似于“我”
this()可以調用本類的其他構造器,可以使用構造器的重用簡化代碼的實現
this()必須寫在構造器的第一行!
一、java調用方法參照兩點:
1,方法簽名(方法名+參數列表)
2,就近原則:
比如 ?f('a',5) ---->f(int ,int)
f(double,int)
3,java參數的傳遞規則
基本類型:值傳遞
引用類型:地址傳遞
二、多態和重載
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;
}
}


-------------------------------------------------------------------
三、對象實例化過程
1,創建類之前,檢查類是否加載,如果沒有加載,先加載父類,再加載該類。
? 加載類:通過CLASSPATH找到.class文件,將硬盤上的.class文件加載到內存中
? java采用按需加載:第一次用到就加載,只加載一次。
2,在內存堆中分配對象空間。遞歸分配所有父類和子類屬性空間。
? 默認自動初始化,初始化"0"值。
3,進行屬性的賦值。
4,遞歸調用父類的構造器。
5,調用本類的構造器。
四、訪問控制修飾符
類內 包內 子類 包外
1,public ? yes yes yes yes
2,protected yes yes yes
3,default yes yes
4,private yes
五、引用類型的轉換
向下轉換:小類型---->大類型 ?(自動轉換)
向上轉換:大類型---->小類型 ?(強制轉換)
六、靜態綁定和動態綁定
多態就是動態綁定
靜態綁定就是在Student對象中有2個屬性name,系統為了加以區分,會為同名屬性加一個標簽:將屬性標記
為在棧內存中聲明的引用變量的類型,調用具體引用變量.屬性時,根據標簽去找,這種現象稱為靜態綁定
七、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最大的好處:“使用方便”
八、static關鍵字
static關鍵字修飾:屬性,方法,內部類,代碼塊。
1) ?static修飾的資源屬于類級別,是全體對象實例共享的資源?
2) ?靜態屬性?
使用static修飾的屬性,屬于類的全體類的實例共享的變量?
靜態屬性是在類的加載期間初始化的?
使用類名.屬性訪問,如:System.out?
3) ?實例變量?
屬于對象的屬性?
使用對象.屬性訪問,如:person.name
九、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的引用,引用指向丌能改,但是對象的屬性可以改
十、抽象類
十一、接口
接口中的屬性,默認是常量 public static final?
接中的方法一定是public abstract的(默認,可以不寫)
十二、Object類
toString() ,hashCode(), equals()
toString()方法,經常由系統默認調用,是活勱當前對象的文本描述?
Object默認返回值: ?全限定名為@hashCode?
建議覆蓋為:當前對象的文本描述
十三、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.
十四、hashCode()方法
hashCode()方法要與equals方法一同覆蓋(sun公司規定)
當兩個對象的equals比較為true時,應具有相同的hashCode()值
當兩個對象equals比較為false時,應具有不同的hashCode()值
hashCode()值要穩定(一致性),一個對象創建以后就不應該再變化
默認的hashCode()值是當前堆對象地址轉換的一個整數,這個整數不是內存地址!
一般使用OID值作為hashCode的值
OID是對象的唯一編號,在項目中一般采用數據庫生成OID,也就是數據庫中的"主鍵"
十五、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")
-----------------------------------------------------------------------
十六、正則表達式
用戶名規則 ^\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}$?
“.”是特殊字符,需要轉義“\.”
十七、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[]
十八、ArrayList(1.2版本以后的)是使用變長數組算法實現的,ArrayList繼承自List
1,ArrayList和Vector的比較
Vector,現成安全,效率稍低,也是使用變長數組算法實現的,繼承自List接口。
ArrayList,線程不安全的,效率高速度快(現在較常用)
2,ArrayList和LinckedList的比較
LinkedList是采用雙向循環鏈表實現的List
ArrayList是采用變長數組算法實現的List
十九、散列表概念
1,容量 散列表中散列數組大小
2,散列運算 key->散列值(散列數組下標)的算法,如: "mm".hashCode()%10->8
3,散列桶 散列值相同的元素的 "線性集合"
4,加載因子 是散列數組加載率,一般小于75%性能比較理想
就是(元素數量/散列數組大小)如 如: 7/10 = 70%
5,散列查找 根據Key計算散列值,根據散列值(下標)找到
6,散列桶 在散列桶中順序比較Key,如果一樣,就返回value
散列表中Key不同,Value可以重復
二十、HashMap
在ArrayList中查找Mac,順序查找,需要查找5次
? 在HashMap中(底層實現原理是散列表)查找Mac,經過散列運算,僅需1次

轉載于:https://www.cnblogs.com/pangblog/p/3243939.html

總結

以上是生活随笔為你收集整理的java学习笔记(3)——面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。