...
*************** Java OOP 基 礎 語 法 總 結 *************************
1,類與對象
1),類(class)是相同屬性和方法的一組集合。
A,類的組成:屬性和方法。
B,語法聲明:使用class關鍵字,eg:public class Student{}//類名首字母大寫,且必須和文件名一致
C,類的實例化:使用new關鍵字,eg:Student student=new Student();//聲明一個Student類型的變數or實例化一個Student對象
D,類與文件的關係;
a,一個java文件可以包含多個java類
b,一個java文件最多只能有一個public類
c,java文件的名稱必須和其中的public類名一致
E,eg:public class Student{//類(首字母大寫)
public void getName(){//方法(一般為動詞+名詞,動詞首字母小寫,名詞首字母大寫)
String name;//屬性(數據類型+屬性名)
}
}
2),對象(object)是一個具體的實體(entity)。
eg:某某學生即可作為一個對象
********************************************************************
2,方法
1),可以重覆執行的代碼塊,對於調用者來說相當於一個“黑盒子”。
2),語法聲明;訪問控制修飾符 返回值類型 方法名 (參數列表){
方法體;
}
eg:public void getName(int num){
String name;
}
3),方法的傳參--數據類型:A,8種基本數據類型(byte,int,short,long,float,double,char,boolean)
B,引用數據類型(eg:Student student=new Student();中的student就是引用數據類型)
註:基本數據類型與引用數據類型的區別:
a,存儲方式不同,基本數據類型存在 棧 中,是按值傳
引用數控類型存在 堆 中,是按址傳
b,使用方式不同,基本數據類型 無屬性和方法
引用數控類型 有屬性和方法
********************************************************************
3,構造方法(Constructor)
1),是一個特殊的方法,該方法的作用是實例化對象,會在記憶體中分配空間,且可以對類的屬性進行初始化
2),語法特征:
a,構造方法的名字必須與所在的類一致
b,沒有返回值類型,註意和沒有返回值不是一回事
c,預設情況下有一個隱式的無參構造方法,其訪問控制修飾與所在的類的訪問控制修飾一致
d,如果我們自定義了構造方法,則隱式無參構造方法就不存在了
3),使用方法:使用new關鍵字調用
********************************************************************
4,包(package)
1),意義:解決命名衝突
2),命名:主要需要知道功能變數名稱反寫,全部字母小寫,不能以數字開頭,eg:com.baidu.zhidao.azhi0828//合法包名
3),如果一個類需要使用另一個包中的類,需要使用import關鍵字導入相應的包,其中java.lang無需顯式導入
********************************************************************
5,可變長度參數
1),是在數據類型後面加上“...”表示,當成數組。
eg:int getTotal(int...num){
代碼塊;
}
2),調用時可以不傳參數,可以傳若幹參數,傳入參數用逗號隔開,也可以傳入數組。
3),一個方法最多只能有一個可變長度參數,而且必須放在最後位置
eg:eg:int getTotal(int num1,int...num2){
代碼塊;
}
********************************************************************
6,命令行參數
***了 解***
********************************************************************
7,方法重載
1),在一個類中,具有相同的方法名,但是參數列表不同的方法。
2),可分為一般方法重載和構造方法重載。
eg:class Student{//同一個類
void getInformation(String name){//相同的方法名,不同的參數列表
***;
}
void getInformation(int age){//相同的方法名,不同的參數列表
***;
}
}
********************************************************************
8,this關鍵字
(1),使用環境:方法和構造方法中。
(2),使用方法兩種:
1),this.屬性(方法);//this表示當前運行的實列(對象),註意:this未運行時,不代表任何屬性(方法)。
2),this();//只能用在構造方法中。表示調用其他重載形式的構造方法,而且必須放在第一行。
(3),註意:靜態方法中不能使用this!(靜態方法屬於類,不是實列,而this代表了當前運行的實列,放一起順序會邏輯混亂),main中也不能使用this!
(4),eg:
1 package com.zhi.java.course;
2 public class Text{
3 Text(int num){//this();只能用在構造方法中
4 this.num=num;
5 }
6 Text(){
7 this(100);//無參方法調用有參
8 }
9 int num=1;
10 int getNum(){
11 return num;//此處可以直接放回num
12 }
13 void setNum(int num){//新定義的num不同於成員變數num
14 this.num=num;//此處this不可省
15 }
16 void m1(){
17
18 }
19 void m2(){
20 this.m1();//此處this可以省
21 }
22 static void m3(){
23 System.out.println(this.num);//Error!Cannot use this in a static context
24 }
25 }
********************************************************************
9,super關鍵字(對比this關鍵字)
(1),使用環境:一般的實列方法中和構造方法中
(2),使用方法兩種:
(1),super.屬性(方法);//調用父類的屬性(方法)
(2),super();//只能用在構造方法中。表示調用父類相應的構造方法,而且必須放在第一行。
********************************************************************
10,final關鍵字
(1),final修飾類,表示該類不能再被繼承;
eg:final class Animal(){}//Animal不能再被繼承。
(2),final修飾變數,該變數必須被賦值,final修飾後該變數變為常量,不能再改變;
eg:final int num=10;//num不可再改變。
(3),final修飾方法,該方法不能再被重寫;
eg:final void m1(){}//方法m1在f父類,在子類中final不能再被重寫。
(4),final修飾屬性,1),可以直接在聲明時賦值
2),可以在代碼塊中賦值
3),靜態的可以在靜態代碼塊中賦值
********************************************************************
11,繼承
(1),概念,繼承是OOP特征之一,是子類通過繼承獲取父類中的部分屬性和方法。
(2),使用extends關鍵字
1),符合is-a關係的設計使用繼承
2),繼承是代碼重用的一種方式
(3),好處:1),做到代碼重用
2),系統維護性更好。
(4),不能繼承的有:1),子類不能繼承父類的構造方法。
2),子類不能繼承父類的私有方法(private)。
3),子類和父類不在同一包,使用預設的訪問許可權的成員
(5),eg:
1 package com.zhi.java.course;
2 public class Animal {
3 String name;//公共的屬性或方法
4 int age;
5 }
6 public class Dog extends Animal {//繼承父類的屬性,一個子類只能繼承一個父類(單根繼承)
7 public static void main(String[] args) {
8 Dog dog = new Dog();
9 dog.name = "大黃";
10 dog.age = 300;
11 String na= "田不易";//也可以有子類的特有屬性(方法)
12 }
13 }
********************************************************************
12,類的初始化順序:(從上到下)
父類的靜態代碼塊
子類的靜態代碼塊
父類的代碼塊
父類的構造方法
子類的代碼塊
子類的構造方法
註意:靜態代碼塊只能執行一次!
********************************************************************
13,訪問控制修飾符
1),概念,a:Java提供四種訪問控制修飾符(public private 包 )
b:放在方法與變數前,部分訪問控制修飾符也可以放在類前
c:目的是控制代碼的訪問許可權。
2),控制範圍(從大到小)
public 所有代碼都可以訪問
protected 本類,包及其子類的代碼可以訪問
包 本類,同一個包中訪問
private 私有的,它修飾的屬性,方法,或內部類只能本類使用
********************************************************************
14,方法重寫
1),概念:在子類中對父類的方法重新實現一遍,即在子類中對父類中某方法的預設邏輯進行修改。
2),語法:a,方法名一樣
b,方法的參數一樣
c,子類重寫的方法返回值類型要與父類返回值類型一樣或者是其子類
d,子類訪問控制修飾符的範圍不能比父類不能小
e,子類拋出的異常不能比父類拋出的異常多或範圍更大
3),以下方法不能重寫:
a,private方法
b,構造方法(Constructor)
c,static方法
d,final方法
********************************************************************
15,Object類
(1),java是單根繼承,在java中不允許多根繼承。
(2),Object是所有類的最終父類,所有類或者是數組都可以直接或間接繼承Object類。
(3),Object類來自java.lang包。
(4),可以將所有的引用類型值賦給Object類型聲明的變數,包括null。
(5),Object提供9中可用方法,所有的子類都都可以使用,其中
getClass(),notiFy(),notiFyall(),wait()不可以被子類重寫
toString(),equals(),hashCode(),clone(),finalize()可以被子類重寫
(6),toString()方法
1),自動調用toString()方法的場景:字元串拼接和控制台輸出,如下列:
1 package com.zhi.java.course;
2 public class Dog {
3 String name;
4 int age;
5 public String getName() {
6 return name;
7 }
8 public void setName(String name) {
9 this.name = name;
10 }
11 public int getAge() {
12 return age;
13 }
14 public void setAge(int age) {
15 this.age = age;
16 }
17 public static void main(String[] args) {
18 Dog dog = new Dog();
19 dog.setName("大黃");
20 dog.setAge(300);
21 System.out.println(dog);//等同於System.out.println(dog.toString());會自動調用toString方法,故有以下結果
22 }
23 }
運行結果: com.zhi.java.course.Dog@2a139a55 //預設實現輸出格式:全限定類名@哈希碼的16進位
2),重寫toString()方法
1 package com.zhi.java.course;
2 public class Dog {
3 String name;
4 int age;
5 public String getName() {
6 return name;
7 }
8 public void setName(String name) {
9 this.name = name;
10 }
11 public int getAge() {
12 return age;
13 }
14 public void setAge(int age) {
15 this.age = age;
16 }
17 @Override//重寫註解,可判斷是否重寫
18 public String toString() {
19 return "名字:"+name+"\n年齡:"+age; //重寫獲得需要的值
20 }
21 public static void main(String[] args) {
22 Dog dog = new Dog();
23 dog.setName("大黃");
24 dog.setAge(300);
25 System.out.println(dog);//等同於System.out.println(dog.toString());已經重寫toString()方法
26 }
27 }
運行結果:名字:大黃
年齡:300
(7),equals()方法重寫
1),當類有邏輯上的等同意義而不僅是對象意義上的等同時 需要重寫equals()方法。
2),以下情況不能重寫:
a,每個類實列本質上是唯一的。
b,不關心類是否提供了“邏輯意義上的等同”測試。
c,超類已經重新了equals,該方法也適合子類。
3),回顧 "==":比較基本數據類型的值是否相等(按值比較),比較引用數據類型是否是同一個對象(按址比較)。
equals:預設與"=="相同,重寫可自定義比較規則。
4),未重寫時結果如下:
1 package com.zhi.java.course;
2 class Game {
3 private String name;
4 private int age;
5 public String getName() {
6 return name;
7 }
8 public void setName(String name) {
9 this.name = name;
10 }
11 public int getAge() {
12 return age;
13 }
14 public void setAge(int age) {
15 this.age = age;
16 }
17 }
18 public class EqualsJob {
19 public static void main(String[] args) {
20 Game g1 = new Game();
21 g1.setName("LOL");
22 g1.setAge(6);
23 Game g2 = new Game();
24 g2.setName("LOL");
25 g2.setAge(6);
26 System.out.println(g1.equals(g2));// 用equals直接比較兩個相同的引用類型,等同System.out.println(g1==g2);
27 }
28 }
運行結果:false
5),重寫equals()後如下:
1 package com.zhi.java.course;
2 class Game {
3 private String name;
4 private int age;
5 public String getName() {
6 return name;
7 }
8 public void setName(String name) {
9 this.name = name;
10 }
11 public int getAge() {
12 return age;
13 }
14 public void setAge(int age) {
15 this.age = age;
16 }
17 @Override
18 public boolean equals(Object obj) {
19 if (this == obj) {
20 return true;
21 }
22 if (obj instanceof Game) {//向下轉型需要通過instanceof判斷obj和Game是否同一類型
23 Game g = (Game) obj;//類型一致則強轉類型,向下轉型
24 return g.getAge() == age && g.getName().equals(name);//自定義比較規則
25 }
26 return false;
27 }
28 }
29 public class EqualsJob {
30 public static void main(String[] args) {
31 Game g1 = new Game();
32 g1.setName("LOL");
33 g1.setAge(6);
34 Game g2 = new Game();
35 g2.setName("LOL");
36 g2.setAge(6);
37 System.out.println(g1.equals(g2));// 使用equals直接比較兩個相同的引用類型
38 }
39 }
運行結果:true
6),equals()重寫約定
a,自反性
b,對稱性
c,傳遞性
d,一致性
e,任何非空x,x.equals(null)總是false
f,重寫equals方法時永遠要重載hashCode方法
********************************************************************
16,向上轉型與向下轉型:
(1),向上轉型:子類的實例可以自動轉換為父類的類型
(2),向下轉型:父類型需要強制轉化為子類型,前提是該對象本身就是子類型的對象,使用instanceof做判斷
********************************************************************
17,抽象類:
(public abstract class shape{}就是一個抽象類)
(1),使用abstract聲明抽象類或抽象方法
(2),抽象類可以有抽象方法,也可以沒有抽象方法,但是抽象方法必須在抽象類中
(3),抽象類不能實例化
(4),抽象類可以有構造方法
抽象方法:(public sbstract void sss();就是一個抽象方法)
(1),沒有實現體
(2),不能被final,private,static修飾
(3),主要給子類來重寫的
如果抽象類的子類是一個具體的類,該具體類必須實現父類的所有抽象方法
如果子類也是抽象類,子類既可以實訓父類的抽象方法,也可以不實現
********************************************************************
18,介面
(1),概念:它是一個純粹的抽象類,其它的方法全部都是抽象方法。它是一種約定,一種能力
(2),聲明語法:使用interface關鍵字,eg:public interface Swimable{}
1),可以聲明屬性,該屬性預設是public static final修飾的,必須賦初始值
2),可以有方法,全部是抽象方法,
3),介面不能直接實例化(介面是一個純粹的抽象類)
(3),介面成員-常量屬性
1),介面中所有的屬性都是public static final修飾的
2),常量可以是基本數據類型,也可以是引用數據類型
(4),註意:1),常量的命名規範是全部字母大寫,eg:public static final int NUM=10;
2),介面的修飾符可能是包級訪問級別的,所以public常量有可能訪問不到
3),推薦使用枚舉保存一組相關的值(至少java5)
(5),繼承介面
1),介面可以使用extends關鍵字繼承另一個介面
2),可以繼承:抽象方法和預設方法,常量屬性,嵌套類型
3),不能繼承靜態方法
(6),實現介面
1),實現介面的具體類需要使用implements關鍵字,並且需要重寫介面中所有的抽象方法。eg:public class Fish implements Swimable{}
2),實現介面的抽象類可以重寫介面中的部分抽象方法。
3),一個類可以實現多個介面,但是只能繼承一個類,而且應先繼承後實現。
4),介面可以作為數據類型用來聲明變數。
5),介面也可以繼承介面。
********************************************************************
19,面向對象的三大特征:封裝,繼承,多態
(1),封裝:將實現的代碼或屬性放在一個類或方法中,不讓外部代碼隨意訪問。
好處:安全。
使用訪問控制修飾符 private
(2),繼承:子類會將父類的部分屬性或方法繼承下來。
好處:做到代碼重用,提高系統的維護性能
使用關鍵字:extends
(3),多態:在不同的場景下,類或方法有不同的指向。
好處:代碼量可以減少
體現:1),方法上的多態:重寫和重載
2),類的多態:類作為方法的參數或返回值類型
********************************************************************
20,介面與抽象類的區別?
1),語法上,介面是使用interface聲明,使用implements實現,
抽象類是使用abstract聲明,使用extends繼承。
2),特定,介面不能有具體的方法,屬性都是靜態常量,
抽象類可以有構造方法、抽象方法、普通方法,還有屬性。
3),設計上,表達某種能力使用介面,
********************************************************************
21,方法重寫與重載的區別?
方法重寫是在子類中對父類的方法重新實現一遍,即在子類中對父類中某方法的預設邏輯進行修改。方法名和參數列表都相同。
方法重載是在一個類中,具有相同的方法名,但是參數列表不同的方法。
為了這個東西,從早上10點弄到現在,除了中午下午吃飯時間,一直沒間斷,好累...
A_zhi
2016/8/28/22/50
******************** 持 續 修 改、補 充... ***************************