文章目錄
- JavaOOP面向對象程式設計
-
- 一、回顧Java
-
- 1、面向對象
- 2、構造函數和方法重載
- 二、Java中的繼承與多态
-
- 1、繼承
- 2、多态
- 三、Java中的接口
-
- 1、接口的概念
-
- 1.1 為什麼需要接口
- 1.2 接口的定義
- 2、Java中的接口
- 3、C#中的接口
- 四、總結
JavaOOP面向對象程式設計
一、回顧Java
1、面向對象
我們在程式設計中多次提到對象,而程式設計的目的就是實作模拟現實的方法設計和開發程式,這就是面向對象。
“面向對象”是一個抽象的概念,難點就在于如何從現實中抽出“類”。類就是對某一類的概念上的描述,需要注意的是類并不是具體的事物,類的對象才是現實的、具體的事物。
是以,對象與類互動的過程就是計算機與人的交流。
2、構造函數和方法重載
構造函數和方法重載的用法與c#并無差別:
構造函數文法:
通路修飾符 類名(){
//内容
}
1、類似方法,隻是少了一個傳回值。
2、方法名有要求:跟類名一緻。
3、構造函數也是會被重載。
方法重載定義:
1、在同一個類中。
2、相同的方法名。
3、不同的參數:
1、個數不相同。
2、對應的參數下标的參數類型不同。
示例:
public class Penguin {
String name = "無名氏";
int health = 100;
int love = 0;
String sex = "Q仔";
public Penguin() {
name = "楠楠";
love = 20;
sex = "Q妹";
System.out.println("執行構造方法");
}
public Penguin(String name, String sex) {
this.name = name;
this.sex = sex;
}
public Penguin(String name,int health,int love, String sex) {
this.name = name;
this.health = health;
this.love = love;
this.sex = sex;
}
public void print() {
System.out.println("寵物的自白:\n我的名字叫" + this.name + ",健康值是" + this.health + ",和主人的親密度是" + this.love + ",性别是" + this.sex + "。");
}
public static void main(String[] args) {
Penguin pgn = null;
pgn = new Penguin();
pgn.print();
pgn = new Penguin("亞亞","企鵝");
pgn.print();
pgn = new Penguin("美美",80,20,"Q仔");
pgn.print();
}
}
二、Java中的繼承與多态
1、繼承
定義:繼承是描述2個類之間的關系。
c#與java的繼承是有所不同的。
java繼承文法:
文法:
修飾符 class 子類名 extends 父類名{
//内容
}
從文法可以看到繼承的關鍵字是“extends”與c#的“:”是完全不同的。
示例:
//父類
public class Pet {
private String name = "無名氏";
private int health = 100;
private int love = 0;
public Pet() {
this.health = 95;
System.out.println("執行寵物的無參構造方法");
}
public Pet(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public int getLove() {
return love;
}
public void print() {
System.out.print("寵物的自白:\n我的名字叫" + this.name + ",我的健康值是" + this.health + ",我和主人的親密度是" + this.love + "。");
}
}
//子類
public class Penguin extends Pet{
private String sex;
public Penguin(String name,String sex) {
super(name);
this.sex = sex;
}
public String getSex() {
return sex;
}
public void print() {
super.print();
System.out.println("性别是" + this.sex + "。");
}
}
//測試類
public class Test {
public static void main(String[] args) {
Penguin pgn = new Penguin("楠楠", "Q妹");
pgn.print();
}
}
2、多态
定義:一個事務的多種形态。
實作方式:重載和重寫。
從以上代碼中可以看到,重寫時與c#不同的是不用加上“override”關鍵字來辨別的,當然前提是兩個類必須有繼承關系。
另外重寫還需注意:
- 不同的類中。
- 相同的方法名。
- 相同參數。
- 通路修飾符:子類方法的通路權限必須大于等于父類方法的通路權限
- 傳回值類型:父類的傳回值類型必須包含子類的傳回值類型。(比如說:父類的傳回值是一個類,那子類重寫時傳回值類型可以是這個類裡的屬性)
和c#一樣java也有抽象類和抽象方法。
文法:
public abstract class 父類名{
public abstract void 方法名();
}
抽象類與c#相比沒有什麼差別,隻是也不用上“override”關鍵字來辨別。
示例:
//父類,寵物類
public abstract class Pet {
protected String name = "無名氏";
protected int health = 100;
protected int love = 0;
public Pet() {
this.health = 95;
System.out.println("執行寵物的無參構造方法");
}
public Pet(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public int getLove() {
return love;
}
public void print() {
System.out.print("寵物的自白:\n我的名字叫" + this.name + ",我的健康值是" + this.health + ",我和主人的親密度是" + this.love + "。");
}
public abstract void eat();
}
//子類,企鵝類
public class Penguin extends Pet{
private String sex;
public Penguin(String name,String sex) {
super(name);
this.sex = sex;
}
public String getSex() {
return sex;
}
public void print() {
super.print();
System.out.println("性别是" + this.sex + "");
}
public void eat() {
super.health = super.health + 5;
System.out.println("企鵝" + super.name + "吃飽了!健康值增加5。");
}
public void swimming() {
System.out.println("企鵝" + super.name + "正在遊泳。");
super.health = super.health - 10;
super.love = super.love + 5;
}
}
//子類,狗狗類
public class Dog extends Pet {
private String strain;
public Dog(String name,String strain) {
super(name);
this.strain = strain;
}
public String getStrain() {
return strain;
}
public void print() {
super.print();
System.out.println("我是一隻" + this.strain + "");
}
public void eat() {
super.health = super.health + 3;
System.out.println("狗狗" + super.name + "吃飽了!健康值增加3.");
}
public void catchingFlyDisc() {
System.out.println("狗狗" + super.name + "制作接飛盤.");
super.health = super.health - 10;
super.love = super.love + 5;
}
}
//主人類
public class Master {
private String name = "";
private int money = 0;
public Master() {}
public Master(String name,int money) {
this.name = name;
this.money = money;
}
public void feed(Pet pet) {
pet.eat();
}
public void feed(Dog dog) {
dog.eat();
}
public void feed(Penguin pgn) {
pgn.eat();
}
public Pet getPet(int typeId) {
Pet pet = null;
if (typeId == 1) {
pet = new Dog("歐歐", "雪納瑞");
} else if (typeId == 2) {
pet = new Penguin("楠楠", "Q妹");
}
return pet;
}
public void play(Pet pet) {
if (pet instanceof Dog) {
Dog dog = (Dog)pet;
dog.catchingFlyDisc();
} else if (pet instanceof Penguin) {
Penguin pgn = (Penguin)pet;
pgn.swimming();
}
}
}
//測試類
public class Test {
public static void main(String[] args) {
Master master = new Master("王先生",100);
Scanner input = new Scanner(System.in);
System.out.println("歡迎來到寵物店!");
System.out.print("請輸入要領養寵物的類型:(1、狗狗 2、企鵝)");
int typeId = input.nextInt();
Pet pet = master.getPet(typeId);
if (pet != null) {
System.out.println("領養成功!");
master.feed(pet);
master.play(pet);
} else {
System.out.println("對不起,沒有此類型的寵物,領養失敗!");
}
}
}
抽象方法的應用在于必須讓子類擁有的動作(方法),也可以說讓事物更加具體、豐滿。
三、Java中的接口
1、接口的概念
1.1 為什麼需要接口
接口在現實中廣泛存在,我們最熟悉的就是“USB接口”了。在這裡我帶大家回顧一下曆史,在個人計算機成為流行的時候,我們需要在電腦上裝軟體是需要用軟碟的,過了一段時間CD光牒和移動硬碟流行了起來,到現在大多數人使用的就隻剩下移動硬碟或者說是U盤了。
那接口在其中有什麼作用呢?
接口是聯通兩個事物的橋梁,你如果需要即可相連,當然不需要的時候直接斷開就行,或者更換。代碼中的接口也是起到這個作用的,它讓我們的代碼不需要在每一種情況下定義不同的類,大大的提高了代碼的複用率。
1.2 接口的定義
文法:
修飾符 interface 接口名 {
//接口成員
}
特點:
- 不能被執行個體化(因為本身就是抽象類);
-
成員方法:隻能是抽象方法,通路修飾abstract;
預設通路修飾:public abstract;
-
成員變量:隻能定義靜态常量;
預設通路符:public static final;
- 不能有構造函數
作用:限制子類必須擁有某種行為(方法)。
2、Java中的接口
實作文法:
public class 類名 extends 父類名 implements 接口名1, 接口名2... {
//接口方法
}
修飾符 interface 接口名 extends 父接口1,父接口2... {
//接口成員
}
從文法中不難發現,接口是可以在類或接口中有多個的。
示例:
//父類,門類
public abstract class Door {
public abstract void open();
public abstract void close();
}
//接口類,鎖門和開門類
public interface Lock {
void lockUp();
void openLock();
}
//子類,防盜門類
public class TheftDoor extends Door implements Lock {
public void lockUp() {
System.out.println("插進鑰匙,向左旋轉鑰匙三圈,鎖上了,拔出鑰匙。");
}
public void openLock() {
System.out.println("插進鑰匙,向右旋轉鑰匙三圈,鎖打開了,拔出鑰匙。");
}
public void open() {
System.out.println("用力推,門打開了。");
}
public void close() {
System.out.println("輕輕拉門,門關上了。");
}
}
//測試類
public class DoorTest {
public static void main(String[] args) {
TheftDoor tfd = new TheftDoor();
tfd.close();
tfd.lockUp();
tfd.openLock();
tfd.open();
}
}
在運作了以上代碼後可以看到模拟了一個防盜門的功能,并且按照現實來說,并不是每一扇門都有上鎖的功能。接口的意義就在這裡,也可以說接口讓每一個對象都是獨特的。
3、C#中的接口
實作文法:
public class 類名 : 父類, 接口1,接口2... {
//接口方法
}
修飾符 interface 接口名 : 父接口1,父接口2... {
//接口成員
}
c#中的接口實作java相比:
- 把關鍵字改成“:”。
- 直接在繼承的父類後用“,”隔開書寫即可。
- 定義屬性和定義方法的修飾雖然有預設值但是不可顯示定義。
有興趣可以試着把“門”這個示例在c#中重新編寫一遍。
四、總結
在java的學習中有了較好的基礎後,在運用基繼承和接口時就能明顯的感受到它們給我們帶來的好處。結合實際中的例子就可以更好地了解為什麼需要這樣做,這樣就能真正看懂代碼,以及如何在生活中運用它。