您好,登錄后才能下訂單哦!
這篇文章主要講解了“java面向對象編程的方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java面向對象編程的方法是什么”吧!
案例《寵物商店》
1.介紹
功能:
a.寵物商店可以進購寵物,出售寵物;
b.寵物具備吃東西的能力;
c.寵物主人可以在寵物商店購買寵物,可以給寵物起名字,喂養寵物;
2. 分析:
通過以上功能介紹和面向對象編程的思想,可以分析得出如下結果:
a. 寵物商店具備進購和出售寵物的功能(即:寵物商店類,命名為 PetShop),同時商店的寵物需要有一個HashMap集合,名為pets,類似于寵物店中的籠子,存放著各種寵物供顧客購買;
b. 寵物基本各自特有屬性,比如說:名字 ,品種等屬性(即:寵物類,命名為pet);
c. 寵物店售賣寵物,那就有各種各樣的寵物,比如說:寵物狗,寵物貓(即:寵物狗類,命名為Dog;寵物貓類,命名為Cat);
d. 寵物主人擁有購買寵物和喂養寵物的功能(即:寵物主人類,命名為:Master);
3. 編碼
通過分析,我們大致了解了我們具體要如何編碼,下面就通過編碼的形式運用它的四大特性;
a. 封裝特性
封裝(英語:Encapsulation)是指一種將抽象性函式接口的實現細節部分包裝、隱藏起來的方法;
封裝可以被認為是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。
了解了封裝的概念,我們大致就知道了寵物的特有屬性是不可隨意改變的,那我們是不是可以把它封裝起來,代碼如下:
import java.util.ArrayList;
import java.util.List;
/*** 封裝特性
*1.通過private修飾符修飾,使外部不可直接訪問 *2.通過get,set方法向外提供間接的訪問
public class Pet {
**/private String id;
private String strain;
private int loveNum;
private int num;
private String name;
public static List<Pet> petSpecies;
static { //靜態代碼塊,只會在第一次執行構造方法的時候執行,初始化petSpecies集合petSpecies = new ArrayList<Pet>();
public Pet(String id,String strain, int loveNum,int num) {
petSpecies.add(new Pet("001","波斯貓",0,9999));
petSpecies.add(new Pet("002","加菲貓",0,9999));
petSpecies.add(new Pet("003","哈士奇",0,9999));
petSpecies.add(new Pet("004","中華田園犬",0,9999));
petSpecies.add(new Pet("005","中華田園貓",0,9999));
petSpecies.add(new Pet("006","牧羊犬",0,9999));
System.out.println("id\t品種");
for(Pet pet:petSpecies) {
System.out.println(pet);
}
}
this.strain = strain;
this.id = id;
this.loveNum = loveNum;
this.num = num;
}
public Pet(){
}
//商店進購寵時,根據商家所選的id和數量給商家返回寵物
public static Pet givePetToShop(String petId,int petNum) {
Pet pet = null;
for(Pet p:petSpecies) {
if(p.getId().equals(petId)) {
pet = p;
pet.setNum(petNum);
return pet;
}
}
return pet;
}
public void eat() {
System.out.println(strain+"正在開心的吃東西");
}
@Override//重寫toString方法
public String toString() {
return this.id+"\t" + this.strain +"\t";
}
@Override//重寫hashCode方法
public int hashCode() {
return this.getId().hashCode();
}
@Override//重寫equals方法
public boolean equals(Object obj) {
if(obj instanceof Pet) {//判斷obj類是否為Pet類或Pet的子類
Pet other = (Pet)obj;
if(this.getId().equals(other.getId())) {
if(this.getStrain().equals(other.getStrain())) {
return true;
}
}
}
return false;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public int getLoveNum() {
return loveNum;
}
public void setLoveNum(int loveNum) {
this.loveNum = loveNum;
}
}
b. 繼承特性
繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為 。
c. 多態性
多態是同一個行為具有多個不同表現形式或形態的能力。
了解了繼承和多態的概念,我們大致知道了貓和狗都屬于寵物,則貓和狗可以繼承寵物的特征和行為,同時每個寵物的行為有不同表現形式,如下代碼所示:
/**
* 繼承特性
*1.狗繼承了寵物的特性
*多態性
*2.狗重寫了吃的行為,即狗吃的行為是寵物吃的一種表現形式
**/
public class Dog extends Pet {private String name;
public Dog() {
}
public Dog(String id,String strain,int loveNum,int num,String name) {
super(id,strain,loveNum,num);//調用父類的有參數的構造方法
this.name = name;
}
@Override//重寫繼承Pet類中的eat()方法
public void eat() {
System.out.println("寵物狗"+name + ":吃的好飽,親密值加5哦!");
this.setLoveNum(this.getLoveNum()+5);//親密值加5
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/*** 繼承特性*1.貓繼承了寵物的特性*多態性*2.貓也重寫了吃的行為,即貓吃的行為是寵物吃的一種表現形式**/
public class Cat extends Pet {
private String name;
public Cat() {
}
public Cat(String id,String strain,int loveNum,int num,String name) {
super(id,strain,loveNum,num);
this.name = name;
}
@Override//重寫eat()方法
public void eat() {
System.out.println("寵物貓"+name + ":吃的好飽,親密值加3哦!");
this.setLoveNum(this.getLoveNum()+3);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
*
* @ClassName: PetShop
* @Description: 寵物商店,具有進購寵物、售賣寵物等功能(方法)
*/
public class PetShop {
private static String name;//店鋪名稱
private static String address;//店鋪地址
private boolean isHasCustom;//判斷是否有顧客前來
private static HashMap<Pet,Integer> pets;//存放寵物的集合,鍵是Pet類,值是寵物的數量
static{//靜態代碼塊,初始化商店里的寵物,只會在第一次執行構造方法 的時候執行 name = "好再來";
address = "二七區海為科技園";
System.out.println("---------"+name+"寵物店——"+address+"分店-------------");
Cat boSiCat = new Cat("001","波斯貓",0,3,"");
Cat coffeCat = new Cat("002","加菲貓",0,2,"");
Dog haShiqi = new Dog("003","哈士奇",0,2,"");
Dog tianYuanQuan = new Dog("004","中華田園犬",0,4,"");
pets = new HashMap<Pet,Integer>();
pets.put(boSiCat, boSiCat.getNum());
pets.put(coffeCat,coffeCat.getNum());
pets.put(haShiqi, haShiqi.getNum());
pets.put(tianYuanQuan,tianYuanQuan.getNum());
}
public PetShop(String name, String address) {
super();
this.isHasCustom = false;
}
public PetShop() {
this.isHasCustom = false;
}
/**
* 展示寵物
*/
public void showAllPet() {
System.out.println("編號\t品種\t數量");
Set<Map.Entry<Pet,Integer>> entry = pets.entrySet();
Iterator it = entry.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
//依據id返回寵物
public Pet getPetById(String id) {
if(id != null) {
for(Pet p:pets.keySet()) {
if(p.getId().equals(id)) {
return p;
}
}
}
return null;
}
/**
* 進購寵物,這里就用到了重寫的equals方法和hashCode方法
*/
public boolean purchasePets(Pet pet) {
Set<Map.Entry<Pet, Integer>> entry = pets.entrySet();
Iterator it = entry.iterator();
while(it.hasNext()) {
if(it.next().equals(pet)) {//如果商店已經包含此寵物,只需更新此寵物的數量
pets.put(pet, pets.get(pet)+pet.getNum());
return true;
}
}
pets.put(pet, pet.getNum());
return true;
}
/**
* 添加寵物,如果已經包含該寵物,則只更改寵物的數量
此功能需要先重寫hashCode()和equals()方法
*/
public boolean addPetToShop(Pet pet) {
if(pet == null)
return false;
if(pets.containsKey(pet)) {
pets.put(pet, pets.get(pet)+pet.getNum());
return true;
}else {
pets.put(pet, pet.getNum());
return true;
}
}
/**
* 從商店出售寵物
*/
public boolean removePetFromShop(Pet pet) {
if(pet == null)
return false;
for(Pet p:pets.keySet()) {
if(p.equals(pet) && pets.get(p) == pet.getNum()) {
pets.remove(p);
return true;
}
if(p.equals(pet) && pets.get(p) > pet.getNum()) {
pets.put(pet, pets.get(p) - pet.getNum());
return true;
}
if(p.equals(pet) && pets.get(p) < pet.getNum()) {
return false;
}
}
return false;
}
/**
* 判斷是否有顧客前來
* @return
*/
public boolean isHasCustom() {
return isHasCustom;
}
public void setHasCustom(boolean isHasCustom) {
this.isHasCustom = isHasCustom;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public HashMap<Pet,Integer> getPets() {
return pets;
}
}
import java.util.ArrayList;
import java.util.List;
/**
*
* @ClassName: Master
* @Description:主人類,有購買寵物等行為(也就是方法)
*/
public class Master {
private String name;
List<Pet> myPets;
public Master() {
myPets = new ArrayList<Pet>();
}
public Master(String name) {
myPets = new ArrayList<Pet>();
this.name = name;
}
//去寵物店的行為
public boolean goPetShop(PetShop shop) {
shop.setHasCustom(true);
return true;
}
//瀏覽寵物行為
public void scanPet(PetShop shop) {
if(goPetShop(shop)) {
shop.showAllPet();
}else {
System.out.println("暫時無法瀏覽寵物!");
}
}
//離開商店的行為
public void outShop(PetShop shop) {
shop.setHasCustom(false);
}
//更新myPets中的寵物的信息
public boolean updateMyPets(Pet pet) {
for(int i = 0;i < myPets.size();i++) {
if(myPets.get(i).equals(pet)) {
myPets.get(i).setName(pet.getName());
myPets.get(i).setNum(pet.getNum());
myPets.get(i).setLoveNum(pet.getLoveNum());
return true;
}
}
return false;
}
//給寵物命名并更新寵物
public boolean setNameToPet(Pet pet,String name) {
if(pet != null && name != null) {
pet = getPetStrain(pet);//獲取寵物的種類
pet.setName(name);//如果是Dog類,就執行Dog類的方法
pet.setLoveNum(50);
updateMyPets(pet);
return true;
}
return false;
}
//購買寵物
public boolean buyPet(Pet pet,PetShop shop) {
if(pet != null) {
pet.setNum(1);
myPets.add(pet);
shop.removePetFromShop(pet);//這里寵物商店里的寵物要減少一只
return true;
}
else
return false;
}
/**
* 給寵物喂食
*/
public boolean feedPet(Pet pet) {
if(pet!= null) {
getPetStrain(pet).eat();
return true;
}
return false;
}
//查看所擁有的寵物信息
public boolean scanMyPets() {
if(myPets.size()==0) {
return false;
}
System.out.println("id\t品種\t名字\t親密值");
for(Pet p:myPets) {
System.out.print(p.getId()+"\t"+p.getStrain()+"\t"+p.getName()
+"\t"+p.getLoveNum()+"\n");
}
return true;
}
//查看某個寵物的親密值
public void loveNumWithPet(String name) {
Pet pet = getMyPetByName(name);
System.out.println(pet.getName() + ":我們的親密值為"+pet.getLoveNum());
}
//通過名字查找寵物
public Pet getMyPetByName(String petName) {
for(Pet pet:myPets) {
if(pet.getName().equals(petName)) {
return pet;
}
}
return null;
}
//獲取寵物的品種
public Pet getPetStrain(Pet pet) {
if(pet.getStrain().equals("波斯貓")||pet.getStrain().equals("加菲貓")) {
return((Cat)(pet));
}
if(pet.getStrain().equals("哈士奇")||pet.getStrain().equals("中華田園犬")) {
return((Dog)(pet));
}
return null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Pet> getMyPets() {
return myPets;
}
public void setMyPets(List<Pet> myPets) {
this.myPets = myPets;
}
}
import java.util.ArrayList;
import java.util.List;
/**
*
* @ClassName: Master
* @Description:主人類,有購買寵物等行為(也就是方法)
* @author yemao
* @date 2019年3月21日
*/
public class Master {
private String name;
List<Pet> myPets;
public Master() {
myPets = new ArrayList<Pet>();
}
public Master(String name) {
myPets = new ArrayList<Pet>();
this.name = name;
}
//去寵物店的行為
public boolean goPetShop(PetShop shop) {
shop.setHasCustom(true);
return true;
}
//瀏覽寵物行為
public void scanPet(PetShop shop) {
if(goPetShop(shop)) {
shop.showAllPet();
}else {
System.out.println("暫時無法瀏覽寵物!");
}
}
//離開商店的行為
public void outShop(PetShop shop) {
shop.setHasCustom(false);
}
//更新myPets中的寵物的信息
public boolean updateMyPets(Pet pet) {
for(int i = 0;i < myPets.size();i++) {
if(myPets.get(i).equals(pet)) {
myPets.get(i).setName(pet.getName());
myPets.get(i).setNum(pet.getNum());
myPets.get(i).setLoveNum(pet.getLoveNum());
return true;
}
}
return false;
}
//給寵物命名并更新寵物
public boolean setNameToPet(Pet pet,String name) {
if(pet != null && name != null) {
pet = getPetStrain(pet);//獲取寵物的種類
pet.setName(name);//如果是Dog類,就執行Dog類的方法
pet.setLoveNum(50);
updateMyPets(pet);
return true;
}
return false;
}
//購買寵物
public boolean buyPet(Pet pet,PetShop shop) {
if(pet != null) {
pet.setNum(1);
myPets.add(pet);
shop.removePetFromShop(pet);//這里寵物商店里的寵物要減少一只
return true;
}
else
return false;
}
/**
* 給寵物喂食
*/
public boolean feedPet(Pet pet) {
if(pet!= null) {
getPetStrain(pet).eat();
return true;
}
return false;
}
//陪寵物玩耍
public boolean playWithPet(Pet pet) {
if(pet!= null) {
getPetStrain(pet).play();
return true;
}
return false;
}
//查看所擁有的寵物信息
public boolean scanMyPets() {
if(myPets.size()==0) {
return false;
}
System.out.println("id\t品種\t名字\t親密值");
for(Pet p:myPets) {
System.out.print(p.getId()+"\t"+p.getStrain()+"\t"+p.getName()
+"\t"+p.getLoveNum()+"\n");
}
return true;
}
//查看某個寵物的親密值
public void loveNumWithPet(String name) {
Pet pet = getMyPetByName(name);
System.out.println(pet.getName() + ":我們的親密值為"+pet.getLoveNum());
}
//通過名字查找寵物
public Pet getMyPetByName(String petName) {
for(Pet pet:myPets) {
if(pet.getName().equals(petName)) {
return pet;
}
}
return null;
}
//獲取寵物的品種
public Pet getPetStrain(Pet pet) {
if(pet.getStrain().equals("波斯貓")||pet.getStrain().equals("加菲貓")) {
return((Cat)(pet));
}
if(pet.getStrain().equals("哈士奇")||pet.getStrain().equals("中華田園犬")) {
return((Dog)(pet));
}
return null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Pet> getMyPets() {
return myPets;
}
public void setMyPets(List<Pet> myPets) {
this.myPets = myPets;
}
}
import java.util.Scanner;
/**
* @ClassName: Test
* @Description: 測試類
* ArrayList在遍歷的時候如果同時刪除元素就會拋出java.util.ConcurrentModificationException異常
*/
public class Test {
private static Scanner sc = new Scanner(System.in);// 實例化一個輸入流對象
public static void main(String[] args) {
PetShop shop = new PetShop();
Master master = new Master("明明");//實例化一個寵物主人,明明
Pet pet = null;
int circleNum = 0;// 表示while循環的次數
int choiceNum = -1;// 操作數
String petId = "";
while(choiceNum == -1) {
circleNum++;
if(circleNum == 1) {
System.out.println("**進購寵物**");
new Pet();//初始化進購的寵物種類,為的是執行Pet.java里的靜態代碼塊
}
System.out.println("選擇操作:1、進購\t2、離開");
choiceNum = sc.nextInt();
if(choiceNum == 1) {
System.out.println("請輸入要進購寵物的id和數量");
pet = Pet.givePetToShop(sc.next(), sc.nextInt());
if(pet != null) {
shop.addPetToShop(pet);//商家進購此寵物
System.out.println("進購成功!");
choiceNum = -1;
}else {//表示輸入的id有誤,沒有此類寵物
System.out.println("沒有此類寵物!");
choiceNum = -1;
}
}else if(choiceNum == 2) {
choiceNum = -2;
}else {
System.out.println("輸入有誤!請重新選擇!");
}
}
circleNum = 0;
master.goPetShop(shop);// 去寵物店
while (shop.isHasCustom()) {
circleNum++;
if (circleNum == 1) {
System.out.println(shop.getName() + ":歡迎" + master.getName() + "光臨本店");
} else {
System.out.println(shop.getName() + ":請選擇要進行的操作:1.瀏覽寵物\t2.離開本店");choiceNum = sc.nextInt();// 從鍵盤控制臺接收一個整數
if (choiceNum == 1) {
master.scanPet(shop);// 明明瀏覽寵物
System.out.println(shop.getName() + ":請輸入編號來選擇您想要的寵物:");
petId = sc.next();
pet = shop.getPetById(petId);// 通過id獲得寵物
if (pet == null) {
System.out.println(shop.getName() + ":請輸入正確的編號!");
} else {
System.out.println(shop.getName() + ":您選擇了" + pet + ",是否確認購買?1.確認購買\t2.在考慮一下");
choiceNum = sc.nextInt();
if (choiceNum == 1) {
master.buyPet(pet, shop);// 明明購買這個寵物
System.out.println(shop.getName() + ":恭喜您獲得新寵!");
}
}
} else if (choiceNum == 2) {
master.outShop(shop);// 離開商店
System.out.println(shop.getName() + ":客官慢走,歡贏下次光臨!");
circleNum = 0;
}
}
}
System.out.println(master.getName()+ "離開了" + shop.getName() + "寵物店,正在回家的路上.......");
String petName = null;
while (true) {
circleNum++;
if (circleNum == 1) {
System.out.println(master.getName() + "回到家了");
System.out.println(master.getName() + ":給新買的寵物們起個名吧!嘻嘻!");
for (Pet p : master.getMyPets()) {
System.out.println("這只寵物是" + p.getStrain() + ",給他起個名字:");
petName = sc.next();
if (master.setNameToPet(pet, petName)) {// 給寵物起名字
System.out.println(pet.getName() + ":有了新名字很開心!親密值增加了" + pet.getLoveNum());
}
}
System.out.println(master.getName() + ":所有的寵物都起好名字了,他們更喜歡我了!");
System.out.println("請選擇操作:1.給寵物喂食\t" +"2.獲取所有的寵物信息\t3.退出:");
choiceNum = sc.nextInt();
}
if (choiceNum > 4 || choiceNum < 1) {
System.out.println("輸入有誤!");
} else {
while (choiceNum == 1) {
System.out.println(master.getName() + ":先喂給誰呢?隨便點名吧!");
pet = master.getMyPetByName(sc.next());
master.feedPet(pet); System.out.println("請選擇操作:1.給寵物喂食\t" +"2.獲取所有的寵物信息\t3.退出:");
choiceNum = sc.nextInt();
}
while (choiceNum == 2) {
master.scanMyPets();
System.out.println("請選擇操作:1.給寵物喂食\t" +"2.獲取所有的寵物信息\t3.退出:");
choiceNum = sc.nextInt();
}
if (choiceNum ==3)
break;
}
}
System.out.println("程序已退出!");
}
}
感謝各位的閱讀,以上就是“java面向對象編程的方法是什么”的內容了,經過本文的學習后,相信大家對java面向對象編程的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。