天天看點

Java OOP初探

Java中最核心的内容就是OOP(面向對象程式設計)。

1、封裝:類的成員在什麼地方可以被通路。封裝一般用通路修飾符來實作,公有方法封裝私有屬性。一般類的成員屬性用private封裝,通過public修飾符實作通路。

(1)類的成員:靜态成員和執行個體成員;靜态成員用static修飾,記憶體放在系統的全局區。可以使用類名調用也可以使用對象名調用。靜态成員之間也可以互相調用,但是靜态成員不能調用執行個體成員。而且靜态類成員常駐記憶體執行個體成員:不用static修飾的類成員。必須用類的對象調用,執行個體成員之間可以互相調用。執行個體成員之間也可以調用靜态成員。執行個體成員是new類的時候配置設定記憶體,如果沒有new類之前用靜态成員調用執行個體成員系統會發生錯誤。原因就是靜态成員調用的執行個體成員系統還沒有配置設定記憶體。靜态成員可以調用new類之後的執行個體成員。

(2)構造方法:和類名相同沒有傳回值也沒有void。構造方法的作用是初始化類的屬性。子類繼承父類時,父類的構造方法不能被繼承。當new類時,構造方法會自動調用,如果程式中沒有構造方法,系統會有一個預設的構造方法。this或super作為構造方法使用,必須在第一句

class A extends B{

public A(String n){

Super();

}

//錯誤

public A(){

this("aa");

super();

(3)方法重載:方法相同方法的簽名不同。包括:方法的參數、類型、個數,與方法的傳回值無關。方法重載可以實作多态。

(4)析構方法:系統回收記憶體。Protectedvoid finalize(){},若想要及時回收用System.gc()實作。

2、繼承:簡化類的設計實作多态。用extends實作類的繼承。

(1)繼承特點:單繼承。當程式中使用接口時可以實作多繼承。子類和父類規定誰的屬性誰負責初始化。子類不能繼承父類的構造函數。當子類調用父類的構造函數時super()寫在子類構造函數的第一行。子類調用父類的構造函數時,從子類一次向父類調用,執行時從父類一次向子類執行。Protected通路修飾符就是為了實作繼承兒設計。

(2)方法重寫:當父類中的方法滿足不了子類中的需要時可以重寫父類中的方法。(父類引用指向子類對象)。這是實作程式多态的核心。

(3)Super:子類中可以用super調用父類的方法和屬性。

(4)abstract:用abstract修飾類時,類就是抽象類。在父類中定義抽象類時,此父類就成為抽象類,父類中的抽象類不能被實作。子類繼承父類時,父類中的抽象類必須在子類中實作,否則子類也為抽象類抽象類不允許執行個體化,抽象類通過定義的抽象方法用來限制子類的行為。隻要類中有抽象方法,該方法必須是抽象方法。抽象方法轉為繼承為設計。

(5)Final修飾符:修飾方法,則方法不能被重寫;修飾屬性,則屬性不能被修改;修飾類,則類不能被繼承。

(6)接口interface:是抽象類和常量的集合。接口相當于純抽象類。可以實作類的多繼承。接口也可以像類一樣的被其他子接口繼承。可以通過關鍵字implements來實作接口。接口可以實作毫不相關的類的公有方法。隻要行為相同就可以用相同的一個接口。接口也可以作為方法的參數和方法的傳回值,這樣更能實作多态的功能。接口是解決類的行為的問題。

3、多态:多種形态,多種行為即多态

(1)靜态多态:有幾個方法重載就有幾種行為;

(2)動态多态:又稱運作時多态,核心是父類引用指向子類對象。

方法重寫:必須和父類有繼承關系的方法。可以使抽象類中的抽象方法,也可以在子類中實作接口。當在子類中有和父類有繼承關系的方法時,才能用父類的引用指向子類的對象。

Instanceof:判斷一個對象是否是某個類的對象;傳回值為true 和 false。

父類:

public abstract class Animal {

//成員方法

privateString name;//封裝屬性

privateString type;//用private封裝

//抽象類

abstractpublic void sound();

//構造函數的方法重載

publicAnimal(String type){

this.type = type;

this.name = "unknown";

publicAnimal(String type,String name){

this.name = name;

//用公有方法通路私有屬性

publicString getType(){

return this.type;

publicString getName(){

return this.name;

publicvoid sayHello(){

System.out.println("我是"+this.type+"類,我的名字叫"+this.name);

接口:

public interface IFly {

abstractvoid fly();

子類一:

public class Bird extends Animalimplements IFly{

publicBird() {

super("鳥");/ /調用父類的構造函數

publicBird(String name) {

super("鳥",name);/ /調用父類的構造函數

@Override//實作父類中的抽象方法

publicvoid sound() {

System.out.println("嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎");

@Override//實作接口中的抽象方法

publicvoid fly() {

System.out.println("我要飛的更高");

子類二:

public class Dog extends Animal {

privateString bread;

publicDog(String bread,String name) {

super("狗",name);//用super調用父類的構造函數初始化父類中的屬性

this.bread = bread;//Dog類中的屬性自己初始化

publicDog(String bread) {

super("狗");

this.bread = bread;

public StringgetBread(){

return this.bread;

System.out.println("我是"+super.getType()+"類,我的名字叫"+super.getName()+",我的品種是"+this.bread);

@Override

System.out.println("25252525252525252");

主類:

public class PetShop {

publicstatic void main(String[] args) {

Dog d1 = new Dog("藏獒","大黃");

Dog d2 = new Dog("卷毛");

Bird b1 = new Bird("鹦鹉");

Bird b2 = new Bird();

Animal [] pets = newAnimal[]{d1,d2,b1,b2};/ / 父類引用指向子類對象(多态)

Animal pet = null;

for (int i = 0; i < 6; i++) {

intindex = new Random().nextInt(pets.length);

pet= pets[index];

pet.sayHello();/ / 必須和父類有繼承關系的方法,才能用父類的對象pet來調用

pet.sound();/ / 必須和父類有繼承關系的方法,才能用父類的對象pet來調用

if(pet instanceof Bird) {/ / 判斷pet指的對象是否是Bird類中的對象

((Bird) pet).fly();

System.out.println("********************************");

運作時多态是通過父類和子類的類型轉換來實作的。用子類表示父類時,要強制性轉換。當父類表示子類時,自動轉換。是以,運作時動态就是用父類指向子類的執行個體實作多态的。