一,需要掌握:
1,會(huì)創(chuàng)建類(lèi)和對(duì)象
2.面向?qū)ο蟮娜筇卣?封裝,繼承,多態(tài).
3.掌握抽象類(lèi)和接口的使用
4.掌握程序中的異常處理
5.會(huì)使用面向?qū)ο笏枷脒M(jìn)行編程
二.開(kāi)發(fā)方法
1.結(jié)構(gòu)化開(kāi)發(fā)(基于c語(yǔ)言)
面向功能劃分軟件結(jié)構(gòu)
自頂而下
最小的子系統(tǒng)是方法
制約了軟件的可維護(hù)性和可擴(kuò)展性
2.面向?qū)ο箝_(kāi)發(fā)
把軟件系統(tǒng)看成各種對(duì)象的集合
系統(tǒng)結(jié)構(gòu)較穩(wěn)定
子系統(tǒng)相對(duì)獨(dú)立
軟件可重用性,可維護(hù)性和可擴(kuò)展性強(qiáng)
三.類(lèi)與對(duì)象
對(duì)象:用來(lái)描述客觀(guān)事物的一個(gè)實(shí)體,由一組屬性和方法構(gòu)成
類(lèi):具有相同屬性和方法的一組對(duì)象的集合
類(lèi)是對(duì)象的抽象,對(duì)象是類(lèi)的具體
public class person {
//屬性(特征):成員變量
public String name;
public int age;
public char sex;
//方法(行為):成員方法
public String showInfo() {
String info = "我叫:"+name+";"+age+"歲;性別"+sex;
return info;
}
}
public class TestPerson {
public static void main(String[] args) {
//創(chuàng)建對(duì)象: 類(lèi)名 對(duì)象名 = new 類(lèi)名();
person p1 = new person();
//使用對(duì)象的屬性和方法:對(duì)象名.屬性 對(duì)象名.方法()
p1.name = "jack";
p1.age = 18;
p1.sex = '男';
String s1 = p1.showInfo();
System.out.println(s1);
person p2 = new person();
p2.name = "rose";
p2.age = 16;
p2.sex = '女';
String s2 = p2.showInfo();
System.out.println(s2);
}
}
注意
方法定義處,參數(shù)叫做形式參數(shù),也叫形參(主要約束參數(shù)的類(lèi)型的)
形參名字可以隨便取,但要符合駝峰命名規(guī)則,同時(shí)要有意義
方法調(diào)用處,參數(shù)叫做實(shí)際參數(shù),也叫實(shí)參
實(shí)參名字可以隨便取,但要符合駝峰命名規(guī)則,同時(shí)要有意義
實(shí)參和形參的類(lèi)型必須一致,名字可以一致,也可以不一致
方法有沒(méi)有返回值和方法有沒(méi)有參數(shù),沒(méi)有任何關(guān)系
方法參數(shù)可以有一個(gè),也可以有多個(gè),多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)
形參和實(shí)參數(shù)量一定要一致,數(shù)據(jù)類(lèi)型一定要一致
四.構(gòu)造方法與方法重載
當(dāng)參數(shù)傳遞為基本數(shù)據(jù)類(lèi)型時(shí),參數(shù)變化不保留,基本數(shù)據(jù)類(lèi)型參數(shù)傳值
當(dāng)參數(shù)傳遞為引用數(shù)據(jù)類(lèi)型時(shí),參數(shù)變化保留,引用數(shù)據(jù)類(lèi)型參數(shù)傳址
方法重載:
同一個(gè)類(lèi)中
方法名相同
參數(shù)個(gè)數(shù)或類(lèi)型不同
與返回值,訪(fǎng)問(wèn)修飾符無(wú)關(guān)
構(gòu)造方法:
(1)該方法缺少返回值
(2)該方法名字必須和類(lèi)名一樣
每個(gè)類(lèi)都有一個(gè)默認(rèn)無(wú)參構(gòu)造方法
但是,一旦手工添加了帶參構(gòu)造方法,那么系統(tǒng)默認(rèn)的無(wú)參構(gòu)造方法就會(huì)被覆蓋掉,如果想使用,就必須顯示的寫(xiě)出來(lái)
public class Student {
String name;
int score;
//一個(gè)類(lèi)中允許出現(xiàn)多個(gè)同名但不同參數(shù)的方法,這種方法叫做重載
//構(gòu)造方法
//(1)該方法缺少返回值 (2)該方法名字必須和類(lèi)名一樣
//每個(gè)類(lèi)都有一個(gè)默認(rèn)無(wú)參構(gòu)造方法
//但是,一旦手工添加了帶參構(gòu)造方法,那么系統(tǒng)默認(rèn)的無(wú)參構(gòu)造方法就會(huì)被覆蓋掉,如果想使用,就必須顯示的寫(xiě)出來(lái)
//方法重載
public Student() {
}
public Student(String name,int score) {
this.name = name;
this.score = score;
}
public void showInfo() {
System.out.println(name+"的成績(jī)是"+score);
}
}
public class ModifyScore {
public void modifyScore(Student[] stus) {
for(int i=0; i<stus.length;i++) {
if(stus[i].score<60) {
stus[i].score+=2;
}
}
}
public void showInfo(Student[] stus) {
for(Student stu:stus) {
stu.showInfo();
}
}
public static void main(String[] args) {
// TODO 自動(dòng)生成的方法存根
ModifyScore ms = new ModifyScore();
Student[] stus = new Student[3];
/*Student s1 = new Student();
s1.name = "jack";
s1.score = 58;*/
Student s1 = new Student("jack",58);
/*Student s2 = new Student();
s2.name = "rose";
s2.score = 98;*/
Student s2 = new Student("rose",98);
Student s3 = new Student();
s3.name = "mandy";
s3.score = 68;
stus[0] = s1;
stus[1] = s2;
stus[2] = s3;
ms.modifyScore(stus);
ms.showInfo(stus);
}
}
五.封裝
1.成員變量與局部變量的區(qū)別:
作用域不同:
局部變量的作用域僅限于定義它的方法
成員變量的作用域在整個(gè)類(lèi)內(nèi)部都是可見(jiàn)的
初始值不同:
Java會(huì)給成員變量一個(gè)初始值
Java不會(huì)給局部變量賦予初始值
注意:
在同一個(gè)方法中,不允許有同名局部變量
在不同方法中,可以有同名局部變量
在同一個(gè)類(lèi)中,成員變量和局部變量同名時(shí),局部變量具有更高的優(yōu)先級(jí)
面向?qū)ο笕筇卣髦? ------封裝
2.封裝的概念:
將類(lèi)的某些信息隱藏在類(lèi)內(nèi)部,不允許外部程序直接訪(fǎng)問(wèn),而是通過(guò)該類(lèi)提供的方法來(lái)實(shí)現(xiàn)對(duì)隱藏信息的操作和訪(fǎng)問(wèn)
封裝的兩個(gè)大致原則:
把盡可能多的東西藏起來(lái),對(duì)外提供便捷的接口
把所有的屬性藏起來(lái)
3.封裝:
1.先將屬性私有化
2.為private的屬性創(chuàng)建共有的setter/getter方法
3.在getter/setter方法中加入屬性控制語(yǔ)句
4.封裝的好處:
1.便于使用者正確使用系統(tǒng),防止錯(cuò)誤修改屬性
2.有助于系統(tǒng)之間的松耦合,提高系統(tǒng)的獨(dú)立性
3.提高軟件的可重用性
4.降低了構(gòu)建大型系統(tǒng)的風(fēng)險(xiǎn)
六.繼承
1.類(lèi)的訪(fǎng)問(wèn)修飾
public修飾符:共有訪(fǎng)問(wèn)級(jí)別
默認(rèn)修飾符:包級(jí)私有訪(fǎng)問(wèn)級(jí)別
image.png
2.static變量
1.類(lèi)的成員變量包括
類(lèi)變量(靜態(tài)變量):
被static修飾的變量
在內(nèi)存中只有一個(gè)拷貝
類(lèi)內(nèi)部,可在任何方法內(nèi)直接訪(fǎng)問(wèn)靜態(tài)變量
其他類(lèi)中,可以直接通過(guò)類(lèi)名訪(fǎng)問(wèn)
實(shí)例變量:
沒(méi)有被static修飾的變量
每創(chuàng)建一個(gè)實(shí)例,就會(huì)為實(shí)例變量分配一次內(nèi)存,實(shí)例變量可以在內(nèi)存中有多個(gè)拷貝,互不影響
2.static變量的作用:
(1)能被類(lèi)的所有實(shí)例共享,可作為實(shí)例之間進(jìn)行交流的共享數(shù)據(jù)
(2)如果類(lèi)的所有實(shí)例都包含一個(gè)相同的常量屬性,可把這個(gè)屬性定義為靜態(tài)常量類(lèi)型,從而節(jié)省內(nèi)存空間
3.static方法:
靜態(tài)方法:可直接通過(guò)類(lèi)名訪(fǎng)問(wèn)
靜態(tài)方法中不能使用this和super
不能直接訪(fǎng)問(wèn)所屬類(lèi)的實(shí)例變量和實(shí)例方法
可直接訪(fǎng)問(wèn)類(lèi)的靜態(tài)變量和靜態(tài)方法
實(shí)例方法:通過(guò)實(shí)例訪(fǎng)問(wèn)
可直接訪(fǎng)問(wèn)所屬類(lèi)的靜態(tài)變量,靜態(tài)方法,實(shí)例變量和實(shí)例方法
靜態(tài)方法必須被實(shí)現(xiàn) main()就是最常用的靜態(tài)方法
//模擬實(shí)現(xiàn)選民投票過(guò)程:一群選民進(jìn)行投票,每個(gè)選民只允許投一次, 并且當(dāng)投票總數(shù)達(dá)到100時(shí),停止投票
public class Voter {
//投票總數(shù),所有選民都會(huì)改變的同一個(gè)數(shù)據(jù) static
public static int count;
//100,最大投票數(shù),適用于全部的所有選民,static final
public static final int MAX_COUNT = 100;
private String name;
//帶參構(gòu)造方法
public Voter(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public void voteFor() {
if(count == MAX_COUNT) {
System.out.println("投票結(jié)束");
return;
}else {
count++;
}
System.out.println(this.name+",感謝您的投票!");
}
public static void printResult() {
System.out.println("選民總數(shù)是:"+count);
}
}
public class TestVoter {
public static void main(String[] args) {
// TODO 自動(dòng)生成的方法存根
Voter lisa = new Voter("lisa");
lisa.voteFor();
Voter.printResult();
for(int i = 1;i <=99;i++) {
Voter v = new Voter("v"+i);
v.voteFor();
}
Voter.printResult();
Voter rose = new Voter("rose");
rose.voteFor();
Voter.printResult();
}
}
方法重寫(xiě)
1.子類(lèi)繼承父類(lèi)的什么?
繼承public和protected 修飾的屬性和方法,不管子類(lèi)和父類(lèi)是否在同一個(gè)包中
繼承默認(rèn)權(quán)限修飾符修飾的屬性和方法,子類(lèi)和父類(lèi)必須在同一個(gè)包中
2.不能被繼承的父類(lèi)成員
private成員
子類(lèi)與父類(lèi)不在同包,使用默認(rèn)訪(fǎng)問(wèn)權(quán)限的成員
構(gòu)造方法
3.子類(lèi)訪(fǎng)問(wèn)父類(lèi)成員
訪(fǎng)問(wèn)父類(lèi)構(gòu)造方法
super();
super(name);
訪(fǎng)問(wèn)父類(lèi)屬性
super.name;
訪(fǎng)問(wèn)父類(lèi)方法
super.print();
注意:
(1)使用super關(guān)鍵字,super代表父類(lèi)對(duì)象
(2)super只能出現(xiàn)在子類(lèi)的方法和構(gòu)造方法中
(3)super調(diào)用構(gòu)造方法時(shí),只能是第一句
(4)super不能訪(fǎng)問(wèn)父類(lèi)的private成員
4.繼承條件下的構(gòu)造方法
繼承條件下構(gòu)造方法的調(diào)用規(guī)則
子類(lèi)構(gòu)造方法沒(méi)有通過(guò)super顯示調(diào)用父類(lèi)的有參構(gòu)造方法,系統(tǒng)默認(rèn)調(diào)用父類(lèi)的無(wú)參構(gòu)造方法
子類(lèi)構(gòu)造方法通過(guò)super顯示調(diào)用父類(lèi)的有參構(gòu)造方法,執(zhí)行相應(yīng)構(gòu)造方法,而不執(zhí)行父類(lèi)無(wú)參構(gòu)造方法
5.方法重寫(xiě)規(guī)則:
方法名相同
參數(shù)列表相同
返回值類(lèi)型相同或者是其子類(lèi)
訪(fǎng)問(wèn)權(quán)限不能?chē)?yán)于父類(lèi)
父類(lèi)的靜態(tài)方法不能被子類(lèi)覆蓋為非靜態(tài)方法,父類(lèi)的非靜態(tài)方法也不能被子類(lèi)覆蓋為靜態(tài)方法
子類(lèi)可以定義與父類(lèi)同名的靜態(tài)方法,以便在子類(lèi)中隱藏父類(lèi)的靜態(tài)方法(注:靜態(tài)方法中無(wú)法使用super,通過(guò)類(lèi)名調(diào)用)
父類(lèi)的私有方法不能被子類(lèi)覆蓋
不能拋出比父類(lèi)方法更多的異常
6.方法重寫(xiě)vs方法重載
Object類(lèi)
Object類(lèi)是所有類(lèi)的直接或間接父類(lèi)
equals()方法
Object類(lèi)的equals()方法
-比較兩個(gè)對(duì)象是否是同一個(gè)對(duì)象,是則返回true
--操作符==
簡(jiǎn)單數(shù)據(jù)類(lèi)型,直接比較值.如1==2
引用類(lèi)型,比較兩者是否為同一對(duì)象
1.單根繼承
Java只支持單根繼承
一個(gè)類(lèi)只能有一個(gè)直接父類(lèi)
一個(gè)類(lèi)可以有多個(gè)間接父類(lèi)
super和this
七.多態(tài)
1.instanceof用于判斷一個(gè)引用類(lèi)型所引用的對(duì)象是否是一個(gè)類(lèi)的實(shí)例
有抽象方法的類(lèi)一定是抽象類(lèi)
抽象類(lèi)就一定有抽象方法嗎?不一定
抽象類(lèi)不能實(shí)例化 Pet pet = new Pet();
抽象類(lèi)的子類(lèi)可以是普通類(lèi),該普通類(lèi)要實(shí)現(xiàn)抽象類(lèi)中的抽象方法
抽象類(lèi)的子類(lèi)也可以是抽象類(lèi),此時(shí),父類(lèi)中的抽象方法可以在子類(lèi)中不被實(shí)現(xiàn)
2.向上轉(zhuǎn)型
- 向上轉(zhuǎn)型:父類(lèi)的引用指向子類(lèi)對(duì)象.自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換
- Pet pet = new Dog();
- <父類(lèi)型> <引用變量名> = new <子類(lèi)型> ();
- 此時(shí)通過(guò)父類(lèi)引用變量調(diào)用的方法是子類(lèi)覆蓋或繼承父類(lèi)的方法,不是父類(lèi)的方法.
- 此時(shí)通過(guò)父類(lèi)引用變量無(wú)法調(diào)用子類(lèi)特有的方法
3.向下轉(zhuǎn)型
如果需要調(diào)用子類(lèi)特有的方法?
向下轉(zhuǎn)型: 將一個(gè)指向子類(lèi)對(duì)象的父類(lèi)引用賦給一個(gè)子類(lèi)的引用,即:父類(lèi)類(lèi)型轉(zhuǎn)換為子類(lèi)類(lèi)型.需強(qiáng)制類(lèi)型轉(zhuǎn)換
Dog dog = (Dog) pet; // 將pet轉(zhuǎn)換為Dog類(lèi)型 - <子類(lèi)型> <引用變量名> = (<子類(lèi)型>) <父類(lèi)型的引用變量>;
- 在向下轉(zhuǎn)型的過(guò)程中,如果煤油轉(zhuǎn)換為真實(shí)子類(lèi)類(lèi)型,會(huì)出現(xiàn)類(lèi)型轉(zhuǎn)換異常
類(lèi)型轉(zhuǎn)換異常:
image.png
4.instanceof
如何減少在向下轉(zhuǎn)型的過(guò)程中,沒(méi)有轉(zhuǎn)換為真實(shí)子類(lèi)類(lèi)型的轉(zhuǎn)換異常? - Java中提供了instanceof運(yùn)算符來(lái)進(jìn)行類(lèi)型的判斷
注意 - 使用instanceof時(shí),對(duì)象的類(lèi)型必須和instanceof后面的參數(shù)所指定的類(lèi)在繼承上有上下級(jí)關(guān)系
Pet dog= new Dog();
if (dog instanceof Dog) {
Dog d = (Dog) dog;
d.catchFly();
}else if (dog instanceof Penguin){
Penguin p = (Penguin) dog;
p.swim();
}
八.抽象類(lèi)與接口
1.抽象類(lèi)與抽象方法
public abstract class Pet { // 抽象類(lèi)
public abstract void toHospital(); // 抽象方法
}
- 抽象類(lèi)VS普通類(lèi)
抽象類(lèi)不能被實(shí)例化
但可以創(chuàng)建一個(gè)引用變量,其類(lèi)型是一個(gè)抽象類(lèi),指向非抽象的子類(lèi)實(shí)例
普通類(lèi)可以被實(shí)例化
- 抽象方法VS普通方法
有無(wú)方法體
- 抽象類(lèi)與抽象方法的使用抽象類(lèi)中可以沒(méi)有抽象方法,但包含了抽象方法的類(lèi)必須被定義為抽象類(lèi)
如果子類(lèi)沒(méi)有實(shí)現(xiàn)父類(lèi)的所有抽象方法,子類(lèi)必須被定義為抽象類(lèi)
沒(méi)有抽象構(gòu)造方法,也沒(méi)有抽象靜態(tài)方法
抽象類(lèi)中可以有非抽象的構(gòu)造方法,創(chuàng)建子類(lèi)的實(shí)例時(shí)可能調(diào)用
2.接口
接口特性:
- 接口中的成員變量
默認(rèn)都是public static final(靜態(tài)常量 )的,必須顯示初始化 - 接口中的方法
默認(rèn)都是public abstract的
除了成員遍量和方法,不能包含其他
實(shí)現(xiàn)類(lèi)必須實(shí)現(xiàn)接口的所有方法 - 接口中沒(méi)有狗造方法,不能被實(shí)例化
- 一格接口不能實(shí)現(xiàn)另一個(gè)接口,但可以實(shí)現(xiàn)類(lèi)可以實(shí)現(xiàn)多個(gè)接口 (Java中的多繼承)
- implements, 多個(gè)接口使用逗號(hào)隔開(kāi)
示例:防盜門(mén)功能
閱讀代碼 找出錯(cuò)誤:
1.不能有構(gòu)造方法
3.不能有普通方法'
4.應(yīng)是public, 不能private私有化;
3.抽象類(lèi)vs接口
- 相同點(diǎn):
代表系統(tǒng)的抽象層
都不能被實(shí)例化
都能包含抽象方法(用于描述系統(tǒng)提供的服務(wù),不必提供具體實(shí)現(xiàn)) - 不同點(diǎn):
在抽象類(lèi)中可以為部分方法提供默認(rèn)實(shí)現(xiàn),而接口中只能包含抽象方法
一個(gè)類(lèi)只能繼承一個(gè)直接的父類(lèi),但可以實(shí)現(xiàn)多個(gè)接口
已存在的繼承樹(shù),可以方便的抽取接口,但是抽取抽象類(lèi)不容易 - 使用原則:
接口做系統(tǒng)與外界交互的窗口(接口提供服務(wù))
接口本身一旦制定,就不允許隨意修改
抽象類(lèi)可完成部分功能實(shí)現(xiàn),還有部分功能可作為系統(tǒng)的擴(kuò)展點(diǎn)