# 面向?qū)ο?/p>
面向過(guò)程:更注重操作的步驟? (微觀)
面向?qū)ο螅焊⒅氐膮⑴c者(宏觀)
**類和對(duì)象的關(guān)系:**
>類是抽象的,對(duì)象是具體的
類是對(duì)象類型奠宜,對(duì)象是類的實(shí)例
編寫類:類名国夜,屬性拣挪,方法
使用類:創(chuàng)建對(duì)象畦攘,給屬性賦值届吁,調(diào)用方法
**成員變量與局部變量的區(qū)別**
| 區(qū)別 |成員變量? | 局部變量
|--|--|---|
| 位置不同 | 類中集绰,方法外 |方法里规辱,方法的形參,代碼塊里
| 作用范圍不同 |整個(gè)類栽燕,整個(gè)類中的所有方法均可以使用|只限于當(dāng)前方法罕袋,或者當(dāng)前語(yǔ)句塊
| 內(nèi)存的存放位置不同 | 存儲(chǔ)在堆內(nèi)存|存儲(chǔ)在棧內(nèi)存
| 有無(wú)默認(rèn)值 |有默認(rèn)值 |沒(méi)有默認(rèn)值
**構(gòu)造方法(構(gòu)造器)**
>1.方法名必須與類名相同
>2.不能寫返回值,也比能寫void碍岔,更不能使用return
>3. 構(gòu)造方法可以重載
**構(gòu)造方法與成員方法的區(qū)別**
| 區(qū)別 |構(gòu)造方法? |成員方法
|--|--|---|
| 作用不同 |用于創(chuàng)建對(duì)象浴讯,并給屬性初始化 |描述對(duì)象所具有的行為
|調(diào)用/使用方式不同 |使用new關(guān)鍵字調(diào)用|使用對(duì)象名調(diào)用
| 執(zhí)行順序不同 | 先執(zhí)行構(gòu)造方法創(chuàng)建對(duì)象|然后使用對(duì)象名去調(diào)用成員方法
| 是否開(kāi)空間 |每執(zhí)行一次都將在堆中開(kāi)一個(gè)空間 |可以被同一個(gè)對(duì)象調(diào)用N多次,調(diào)用一次加載到棧內(nèi)存一次蔼啦,執(zhí)行完出棧
**this關(guān)鍵字**
this代表的是當(dāng)前對(duì)象的引用(地址)
>作用:
>(1)使用本類的屬性? this.屬性,榆纽, this可以省略不寫
(2)使用本類的中方法 this.方法(),this可以省略不寫
(3)調(diào)用本類的其它構(gòu)造方法 this() ,this(....) ,要求必須是構(gòu)造方法中第一句代碼
(4)用于區(qū)分成員變量和局部變量this..代表成員變量
**static關(guān)鍵字**
>(1) static可以修飾成員變量? ,稱為靜態(tài)變量 奈籽,在方法區(qū)? ?
>標(biāo)準(zhǔn) 使用方式:? 類名.靜態(tài)變量名
(2)static可以修飾成員方法饥侵,稱為靜態(tài)方法
? ? ? 標(biāo)準(zhǔn)使用方式: 類名.方法名();
(3)static 修飾代碼塊:稱為靜態(tài)代碼塊, 為類的靜態(tài)變量進(jìn)行賦初始值
構(gòu)造方法衣屏,構(gòu)造代碼塊,靜態(tài)代碼塊執(zhí)行順序:
靜態(tài)代碼塊>構(gòu)造代碼塊>構(gòu)造方法
(4)修飾內(nèi)部類? 稱為靜態(tài)內(nèi)部類
**注意事項(xiàng):
static方法不允許使用成員變量**
**final關(guān)鍵字**
>(1) final修飾的變量稱為常量
final修飾成員變量躏升,通常與static一起使用,稱為**靜態(tài)常量**
final修飾的局部變量稱為**常量**
? final修飾的基本數(shù)據(jù)類型勾拉,其**值**不允許更改
final修飾的引用數(shù)據(jù)類型, 其**地址**不允許更改
(2)修飾方法? :不允許子類重寫煮甥,但是可以被子類調(diào)用
(3)修飾類:不允許有子類的,所以稱為太監(jiān)類
**abstract關(guān)鍵字**
>(1)修飾類稱為抽象類(特征:就是不能創(chuàng)建對(duì)象)
(2)修飾方法 :使用abstract修飾的方法稱為抽象方法
抽象方法的特點(diǎn):
1沒(méi)有方法體,只能以分號(hào)結(jié)尾
2.必須定義在抽象類里
3.必須被子類實(shí)現(xiàn)藕赞,如果子類不實(shí)現(xiàn),那么子類也得是抽象類
注:抽象類里可以包含0個(gè)或多個(gè)抽象方法卖局,抽象方法必須定義在抽象類中
**interface關(guān)鍵字**
>類與接口的關(guān)系 implements(實(shí)現(xiàn))
一個(gè)類即存在繼承關(guān)系又存在實(shí)現(xiàn)關(guān)系斧蜕,繼承在前(extends),實(shí)現(xiàn)在后 (implements)
接口中的變量均為公共的靜態(tài)常量
java中的類是單繼承的,java中的接口是多繼承的
**super關(guān)鍵字**
>(1)調(diào)用父類的非私有屬性
>(2)調(diào)用父類的構(gòu)造方法砚偶,要求必須是構(gòu)造方法中第一句代碼
>(3)調(diào)用父類的非私有成員方法
>(4)用于父類與子類的同名屬性的區(qū)分,super指代的是父類,this指代的是子類
**面向?qū)ο蟮娜筇卣?*
>(1)封裝:提高程序的安全性
(2)繼承:提高代碼的復(fù)(重復(fù)使)用性
(3)多態(tài):提高程序的擴(kuò)展性
**封裝:訪問(wèn)權(quán)限**
>public :最大的訪問(wèn)權(quán)限
protected :子類方訪問(wèn)權(quán)限
package? :包內(nèi)訪問(wèn)權(quán)限
private? :本類訪問(wèn)權(quán)限
**方法重載**
>(1)在一個(gè)類里面為一種行為提供多種實(shí)現(xiàn)方式并提高可讀性
>(2)方法名相同批销,參數(shù)不同(類型不同,個(gè)數(shù)不同染坯,順序不同)
**方法重寫**
>(1)父類方法無(wú)法滿足子類的要求均芽,子類通過(guò)方法重寫滿足要求
(2)發(fā)生在子類
(3)方法名,參數(shù)類型单鹿,個(gè)數(shù)掀宋,順序必須與父類完全相同
(4)子類返回值小于等于父類的返回值
(5)子類訪問(wèn)權(quán)限大于等于父類的訪問(wèn)權(quán)限
**多態(tài)的前提**
>(1)繼承是多態(tài)的前提
>(2)子類重寫父類的方法
>(3)父類引用? new子類對(duì)象
**如何使用封裝去保證屬性的安全性**
>(1)屬性私有化 private
(2)提供公有的取值,賦值方法
(3)在賦值的方法中進(jìn)行值的合理性驗(yàn)證
**封裝代碼:**
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Person
* date: 2019/8/17 16:37
* Description:
* 定義Person類
* 屬性私有化
* 提供共有的取值賦值方法
* 在賦值的方法內(nèi)進(jìn)行合理性驗(yàn)證
*/
public class Person {
? ? //屬性私有化
? ? private String name;
? ? private int age;
? ? private String gender;
? ? //提供共有的取值賦值方法
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? public void setAge(int age) {
? ? ? ? //在賦值的方法中對(duì)值進(jìn)行合理性驗(yàn)證
? ? ? ? if(age<=18||age>=25){
? ? ? ? ? ? System.out.println("對(duì)不起仲锄,年齡要在18到25之間");
? ? ? ? ? ? this.age=18;//給屬性設(shè)置默認(rèn)值
? ? ? ? }else{
? ? ? ? ? ? this.age=age;//將局部變量的值賦給成員變量
? ? ? ? }
? ? }
? ? public String getGender() {
? ? ? ? return gender;
? ? }
? ? public void setGender(String gender) {
? ? ? ? //在賦值的方法中對(duì)值進(jìn)行合理性驗(yàn)證
? ? ? ? if(!"男".equals(gender)&&!"女".equals(gender)){
? ? ? ? ? ? System.out.println("對(duì)不起劲妙,性別有誤");
? ? ? ? ? ? this.gender="男";//給屬性設(shè)置默認(rèn)值
? ? ? ? }else{
? ? ? ? ? ? this.gender=gender;
? ? ? ? }
? ? }
? ? //無(wú)參構(gòu)造
? ? public Person() {
? ? }
? ? //帶參構(gòu)造
? ? public Person(String name, int age, String gender) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? ? ? this.gender = gender;
? ? }
? ? //成員方法
? ? public void show(){
? ? ? ? System.out.println(name+"\t"+age+"\t"+gender);
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: TestPerson
* date: 2019/8/17 16:57
* Description:
* 定義測(cè)試類
*/
public class TestPerson {
? ? public static void main(String[] args) {
? ? ? ? Person p=new Person();//創(chuàng)建對(duì)象(無(wú)參)
? ? ? ? p.setAge(5);
? ? ? ? System.out.println(p.getAge());//對(duì)不起,年齡要在18到25之間? 設(shè)置為18
? ? ? ? Person pp=new Person("王小五",22,"人妖");//創(chuàng)建帶參構(gòu)造
? ? ? ? pp.show();//提示錯(cuò)誤信息 :對(duì)不起儒喊,性別有誤? ? ? 王小五 22 男(改為默認(rèn)值)
? ? }
}
```
**繼承代碼(一父二字一測(cè)試)**
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Animal
* date: 2019/8/17 19:05
* Description:
* 定義一個(gè)Animal類
* 定義兩個(gè)私有屬性 color age
* 三個(gè)方法 eat sleep? introduce
*/
public class Animal {
? ? private String color;
? ? private int age;
? ? public String getColor() {
? ? ? ? return color;
? ? }
? ? public void setColor(String color) {
? ? ? ? this.color = color;
? ? }
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }
? ? public void eat(){
? ? ? ? System.out.println("我餓了镣奋,我想吃東西!;忱ⅰ侨颈!");
? ? }
? ? public void sleep(){
? ? ? ? System.out.println("我困了,我想睡覺(jué)P疽濉9浮!毕贼!");
? ? }
? ? public void introduce(){
? ? ? ? System.out.println("Animal:"+color+"? "+age);
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Dog
* date: 2019/8/17 19:09
* Description:
* 定義一個(gè)dog類
* dog直接繼承animal類 温赔,間接繼承object類
* 一個(gè)私有屬性? name
* 定義一個(gè)自己方法
* 覆蓋父類的方法
* 重寫父類的introduce方法
*/
public class Dog extends Animal {//extend繼承? dog類繼承animal類
? ? private String name;
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public void show(){
? ? ? ? System.out.println("小狗汪汪汪!9硌ⅰ陶贼!");
? ? }
? ? @Override
? ? public void introduce() {//重寫父類的introduce
? ? ? ? System.out.println("我是二哈啤贩,我會(huì)拆家!0菅怼痹屹!");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Cat
* date: 2019/8/17 19:14
* Description:
* 定義cat類
* 一個(gè)私有屬性? name
* 一個(gè)方法? show
*/
public class Cat extends Animal {
? ? private String name;
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public void show(){
? ? ? ? System.out.println("我會(huì)捉老鼠!M鞯志衍!");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Test
* date: 2019/8/17 19:17
* Description:
* 編寫測(cè)試類
* 創(chuàng)建兩個(gè)對(duì)象 dog和cat
*/
public class Test {
? ? public static void main(String[] args) {
? ? ? ? //dog
? ? ? ? Dog dog=new Dog();//創(chuàng)建對(duì)象
? ? ? ? dog.setName("二哈");
? ? ? ? dog.setAge(2);
? ? ? ? dog.setColor("黑白相間");
? ? ? ? dog.eat();//從父類繼承
? ? ? ? dog.introduce();//方法重寫調(diào)用自己的
? ? ? ? dog.sleep();//從父類繼承
? ? ? ? dog.show();//子類自己的
? ? ? ? //cat
? ? ? ? Cat cat=new Cat();
? ? ? ? cat.setColor("橘色");
? ? ? ? cat.setAge(3);
? ? ? ? cat.eat();
? ? ? ? cat.introduce();
? ? ? ? cat.sleep();
? ? ? ? cat.show();
? ? }
}
```
**多態(tài)代碼(一父二字一測(cè)試)**
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Car
* date: 2019/8/17 20:20
* Description:
* 定義汽車類
* 定義兩個(gè)方法 run show
* run子類繼承
* show子類重寫
*/
public class Car {
? ? //子類繼承
? ? public void run(){
? ? ? ? System.out.println("我在公路上馳騁,不允許飆車A奶妗Bシ尽!");
? ? }
? ? //子類重寫
? ? public void show(){
? ? ? ? System.out.println("我是輛好車H乔摹4航小!");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Bwm
* date: 2019/8/17 20:25
* Description:
* 定義bwm類
* 重寫父類手方法
* 自己定義speed方法(獨(dú)有)
*/
public class Bwm extends Car {
? ? //重寫父類方法
? ? @Override
? ? public void show() {
? ? ? ? System.out.println("我是寶馬F邸T葜场!");
? ? }
? ? //子類特有
? ? public void speed(){
? ? ? ? System.out.println("我可以達(dá)到200邁");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Fll
* date: 2019/8/17 20:31
* Description:
* 定義Fll類
* 重寫父類show方法
* 自己定義login方法
*/
public class Fll extends Car {
? ? @Override
? ? public void show() {
? ? ? ? System.out.println("我是法拉利5鄙础G好俊!");
? ? }
? ? public void login(){
? ? ? ? System.out.println("我的車標(biāo)是一匹奔騰的馬F侣取3亢帷!");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: TestCar
* date: 2019/8/17 20:35
* Description:
* 定義測(cè)試類TestCar
* 1.沒(méi)有使用多態(tài) 只能調(diào)用父類的方法
* 2.使用多態(tài) 父類引用 new子類對(duì)象
* 向上類型轉(zhuǎn)換(自動(dòng)類型轉(zhuǎn)換)
* 只能調(diào)用父類中存在的方法,或者是重寫的方法
* 在子類中定義的方法將不能使用
* 向下類型轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換) 可以調(diào)用子類獨(dú)有的方法
*/
public class TestCar {
? ? public static void main(String[] args) {
? ? ? ? //沒(méi)有使用多態(tài) 只能調(diào)用父類的方法
? ? ? ? Car c=new Car();
? ? ? ? c.run();
? ? ? ? c.show();
? ? ? ? //使用多態(tài) 父類引用 new子類對(duì)象
? ? ? ? //向上類型轉(zhuǎn)換(自動(dòng)類型轉(zhuǎn)換)
? ? ? ? //只能調(diào)用父類中存在的方法,或者是重寫的方法
? ? ? ? //在子類中定義的方法將不能使用
? ? ? ? Car car=new Bwm();
? ? ? ? car.show();
? ? ? ? //向下類型轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換)
? ? ? ? Bwm b=(Bwm)car;
? ? ? ? b.speed();//調(diào)用子類獨(dú)有的方法
? ? ? ? Car car1=new Fll();//使用多態(tài)
? ? ? ? car1.show();
? ? ? ? Fll f=(Fll) car1;
? ? ? ? f.login();//調(diào)用子類獨(dú)有的方法
? ? }
}
```
**接口的使用**
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Human
* date: 2019/8/17 14:14
* Description:
* 定義一個(gè)人類的統(tǒng)稱
* 定義接口
* 定義三個(gè)方法 laugh cry talk
*/
public interface Human {//首先定義什么是人類
? ? //人是快樂(lè)的廉沮,會(huì)笑
? ? public void laugh();
? ? //人類還會(huì)哭颓遏。代表痛苦
? ? public void cry();
? ? //人類還會(huì)說(shuō)話
? ? public void talk();
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: YellowHuman
* date: 2019/8/17 14:32
* Description:
* 定義具體的人類
* 黃種人
* 重寫human接口的三個(gè)方法
*/
public class YellowHuman implements Human {
? ? @Override
? ? public void laugh() {
? ? ? ? System.out.println("黃種人會(huì)笑,開(kāi)心呀滞时!幸福呀叁幢!");
? ? }
? ? @Override
? ? public void cry() {
? ? ? ? System.out.println("黃種人會(huì)哭,有心事坪稽!");
? ? }
? ? @Override
? ? public void talk() {
? ? ? ? System.out.println("黃種人會(huì)說(shuō)話曼玩,一般都是雙字節(jié)!");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: WhiteHuman
* date: 2019/8/17 14:37
* Description:
* 定義白種人
* 重寫human接口的三個(gè)方法
*/
public class WhiteHuman implements Human {
? ? @Override
? ? public void laugh() {
? ? ? ? System.out.println("白種人會(huì)大笑窒百,侵略的笑聲黍判!");
? ? }
? ? @Override
? ? public void cry() {
? ? ? ? System.out.println("白種人也會(huì)哭!");
? ? }
? ? @Override
? ? public void talk() {
? ? ? ? System.out.println("白種人會(huì)說(shuō)話篙梢,一般都是單字節(jié)顷帖!");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: BlockHuman
* date: 2019/8/17 14:42
* Description:
* 定義黑人? 類
* 重寫human接口的三個(gè)方法
*/
public class BlockHuman implements Human{
? ? @Override
? ? public void laugh() {
? ? ? ? System.out.println("黑人會(huì)笑。");
? ? }
? ? @Override
? ? public void cry() {
? ? ? ? System.out.println("黑人也會(huì)哭!");
? ? }
? ? @Override
? ? public void talk() {
? ? ? ? System.out.println("黑人會(huì)說(shuō)話贬墩,一般人聽(tīng)不懂榴嗅!");
? ? }
}
```
```
/**
* @author lh
* @since JDK 1.8
* ClassName: Test
* date: 2019/8/17 21:06
* Description:
* 定義測(cè)試類
* 創(chuàng)建三個(gè)實(shí)例
* 分別調(diào)用自己的方法
*/
public class Test {
? ? public static void main(String[] args) {
? ? ? ? Human h=new BlockHuman();
? ? ? ? h.cry();
? ? ? ? h.laugh();
? ? ? ? h.talk();
? ? ? ? Human h1=new YellowHuman();
? ? ? ? h1.cry();
? ? ? ? h1.laugh();
? ? ? ? h1.talk();
? ? ? ? Human h2=new WhiteHuman();
? ? ? ? h2.cry();
? ? ? ? h2.laugh();
? ? ? ? h2.talk();
? ? }
}
```
**注:一定要理解,理解陶舞,理解嗽测,多做練習(xí)!V追酢唠粥!**