一.面向對象的四大支柱:
- 1.抽象:定義一個類的過程就是抽象的過程(數據抽象、行為抽象),
通過抽象我們可以將數據和操作數據的方法以“對象”的概念綁定在一起;
抽象的過程是一個仁者見仁智者見智的過程,對同一個對象進行抽象可能會有不同的結果;
- 2.封裝:隱藏一切可以隱藏的實現細節,只向外界提供最簡單的編程接口;
- 3.繼承:從一個已有的類創建一個新類的過程,提供繼承信息的叫父類(超類、基類),
得到繼承信息的叫子類(派生類、衍生類),繼承是是現代碼復用的一種手段
- 4.多態: 同樣的引用類型調用了相同的方法做了不同的事情
-實現多態的兩個關鍵步驟:1方法重寫(注意與方法重載的區別),2對象造型
二.通常程序員能在內存里操控的三塊區域
- 棧---快、小-臨時變量/局部變量(方法里面的變量)
- 堆---稍慢、特別大(可調整,理論上可以調到物理內存的大小)-對象
- 方法區---代碼,常量
三.繼承-extends
1.多態的使用
- 同樣的類型調用相同的方法(發出同樣的消息)但是做了不一樣的事情-這就是多態(polymorphism)
- 如何實現多態:
1.方法重寫-子類在繼承父類得過程中對父類的方法給出自己的實現版本
2.對象造型-用父類型的變量保存子類的對象
2.枚舉的定義
- enum
3.instaanceof運算符
- instanceof是一種運算符,可以判斷對象是不是某種類型,結果產生的是布爾值
- 該運算符是在程序運行時判斷對象的類型-RTTI
4.抽象類和抽象方法-abstract
- 抽象方法:
1.一個方法暫時無法給出實現,那么可將其聲明為抽象方法;用abstract關鍵字修飾,且沒有方法體
2.一個類如果包含抽象方法(說明該類不完整),那么該類也必須要聲明為抽象類
3.抽象類不能實例化(不能創造抽象類的對象)
4.抽象類是專門留給其他類去繼承的類
5.方法重寫(注意與方法重載的區別)
@Override
方法重寫(置換,覆蓋,覆寫),父類有這個方法可能實現了,可能沒實現
子類把父類的這個方法重新實現一次(給出自己的版本)
- 重載:同一個類中有同名的方法,只要參數列表不相同就可以共存-overload
- 重寫:子類在繼承父類當中對父類已有的方法給出新的實現版本-override
6.四種訪問修飾符
java四種訪問修飾符:private<default<protectd<public
- 1.private:同類
- 2.default:同類,同包
- 3.protected:同類,同包,子類
- 4.public:同類,同包,子類,不同包
package Day12_12_01;
public class PetTest
{
public static void main(String[] args)
{
//temp在棧上,它保存了堆上的Cat對象的地址
//通過temp就可以找到堆上的對應的Cat對象并給對象發消息
//所以我們通常把對象類型的變量稱為對象的引用
//java中的類型分為兩大類:
// 1.基本數據類型(8種)和枚舉類型
// 2.引用類型
Pet temp=new Cat("花花", Sex.FEMLE, "藍色");
Pet[] petsArray=
{
new Dog("旺財", Sex.MALE, true),
new Cat("咪咪", Sex.FEMLE, "黃色"),
new Dog("歡歡", Sex.FEMLE, false),
new Pig("發財", Sex.FEMLE,100)
};
for(Pet pet:petsArray)
{
pet.eat();
pet.play("球球");
pet.makeVoice();
if(pet instanceof Dog)
{
((Dog) pet).keepTheDoor();
}else if(pet instanceof Cat){
((Cat) pet).climbUpTheTree();
}else if(pet instanceof Pig){
System.out.println(pet.getNickname()+"重"+((Pig) pet).showWeight()+"公斤");
}
}
}
}
- 父類
package Day12_12_01;
/**
* 寵物
* @author YY
*
*/
public abstract class Pet
{
private String nickname;
private Sex sex;
/**
*構造器
* @param nickname
* @param sex
*/
public Pet(String nickname, Sex sex)
{
this.nickname = nickname;
this.sex = sex;
}
/**
*得到名字
* @return
*/
public String getNickname()
{
return nickname;
}
/**
* 得到性別
* @return
*/
public String getSex()
{
return sex==Sex.MALE?"公":"母";
}
/**
* 吃東西
*/
public void eat()
{
System.out.println(nickname + "正在吃東西");
}
/**
* 玩耍
* @param thing 玩的東西
*/
public void play(String thing)
{
System.out.println(nickname + "正在玩" + thing);
}
/**
* 發出聲音
*/
public abstract void makeVoice();
}
- 子類-Cat
package Day12_12_01;
public class Cat extends Pet
{
private String colorOfEye;
public Cat(String nickname, Sex sex,String colorOfEye)
{
super(nickname, sex);
this.colorOfEye=colorOfEye;
}
public String getColorOfEye()
{
return colorOfEye;
}
public void climbUpTheTree()
{
//this可以換成super,或者去掉
System.out.println(this.getNickname()+"正在爬樹");
}
@Override
public void makeVoice()
{
System.out.println(this.getNickname()+"喵喵叫");
}
}
- 子類Dog
package Day12_12_01;
/**
* 狗類
*
* @author YY
*
*/
public class Dog extends Pet
{
private boolean large;
/**
* 構造器
*
* @param nickname
* @param sex
* @param large
*/
public Dog(String nickname, Sex sex, boolean large)
{
super(nickname, sex);
this.large = large;
}
/**
* large的訪問器
*
* @return
*/
// 布爾類型的訪問器前綴不是get,而是is;
public boolean isLarge()
{
return large;
}
/**
* 看
*/
public void keepTheDoor()
{
System.out.println(this.getNickname() + "正在看門");
}
public void makeVoice()
{
System.out.println(this.getNickname()+"汪汪叫");
}
}
- 子類Pig
package Day12_12_01;
public class Pig extends Pet
{
private int weight;
public Pig(String nickname, Sex sex,int weight)
{
super(nickname, sex);
this.weight=weight;
}
public int showWeight()
{
return this.weight;
}
@Override
public void makeVoice()
{
System.out.println(this.getNickname()+"豬豬叫");
}
}
- 枚舉的定義
package Day12_12_01;
public enum Sex
{
MALE,FEMLE
}