天天看點

Java基礎掃盲包名取名規範方法的重載構造器封裝繼承多态抽象類接口

本篇博文針對有其它程式設計語言基礎,但未接觸Java的讀者。讀完本篇博文,能夠對Java面向對象的特性有個基本認識,基本掌握Java文法,看懂相關代碼。

包名取名規範

包名=域名反向

例如:

域名:www.baidu.com

包名:com.baidu

方法的重載

重載:在一個類中,有相同的函數名稱,但形參不同的函數。

形參不同,可以是數量不同,或者類型不同。

例如:

public static int max(int num1, int num2){...}

public static int max(int num1, int num2, int num3){...}

public static double max(double num1, double num2, double num3){...}           

複制

構造器

構造器作用,給New出的對象進行初始指派。

無參構造

定義一個類Person

public class Person {
    public Person() {
    }
}           

複制

和類名相同的Person()就是無參構造。

有了無參構造之後,可以在main函數中new出對象。

Person person = new Person();           

複制

有參構造

public class Person {

   String name;
   public Person() {
   }

   public Person(String name){
       this.name = name;
   }
}           

複制

這裡在Person的構造中傳遞了參數name,于是在main中可以傳遞進具體的name。

public class Main {
    public static void main(String[] args) {
        Person person = new Person("zstar");
        System.out.println(person.name);
    }
}           

複制

注:有參構造必須存在空的無參構造,否則會報錯。

封裝

想象一台電視機,使用者不能直接操縱内部的電路,但是卻能夠通過外面的按鈕來間接的控制内部電路的變化。

封裝就是同樣的道理,内部的電路就是屬性私有private,外部的按鈕就是public方法。

重新修改Person類:

public class Person {

    private String name;
    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}           

複制

在這個Person類中,name前加了private關鍵字,這代表着隻有類的内部可以通過.name的方式來修改name。不加關鍵字則預設default,外部可以直接對它進行操作。

getName 和 setName 為兩個public方法,外部可以直接調用這兩個方法來實作目的。

進行測試:

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("zstar");
        System.out.println(person.getName());
    }
}           

複制

意義:現在外部無法對内部的屬性進行操作,保證了資料的安全性,方法内可以添加添加來對使用者的輸入進行限制。

注:Alt+INSENT 快捷鍵可以快速建立這兩個方法。

繼承

關鍵詞:extends

保持上面的Person類不變,建立一個類Son。

public class Son extends Person {
}           

複制

再修改測試代碼:

public class Main {
    public static void main(String[] args) {
        Son son = new Son();
        son.setName("zstar");
        System.out.println(son.getName());
    }
}           

複制

執行個體化的是Son這個對象,發現Son繼承Person類後能夠使用Person類的所有方法。

注:ctrl + H 可以檢視目前類的繼承樹,一個類隻能直接繼承另一個類,所有的類都繼承Object這個類。

Java基礎掃盲包名取名規範方法的重載構造器封裝繼承多态抽象類接口

關鍵詞:super

通過super,可以在子類中調用父類的屬性或方法。

給Person類新增一個方法:

public  void print(){
        System.out.println("我是爹");
    }           

複制

修改Son類:

public class Son extends Person {

    public void print(){
        System.out.println("我是兒子");
    }

    public void test(){
        this.print();
        super.print();
    }
}           

複制

測試:

public class Main {
    public static void main(String[] args) {
        Son son = new Son();
        son.test();
    }
}           

複制

測試結果:

Java基礎掃盲包名取名規範方法的重載構造器封裝繼承多态抽象類接口

通過這個例子,可以發現,this.print調用了子類中的print方法,而super.print調用了父類中的方法。

注:父類中私有的private屬性或方法被繼承後無法通路,super調用父類的構造方法,必須在構造方法的第一個。

方法重寫

當子類和父類有相同的方法(方法名一樣,參數一樣)時,可以在子類的方法上加上注解@override,對該方法進行重寫,建立的對象均使用子類的方法。

多态

多态:同一方法可以根據發送對象的不同而采用多種不同的行為方式。

如果兩個對象存在繼承關系,可以進行對象的轉換。

比如,Son 繼承 Person

Son a = new Son();
Person b = new Son();           

複制

但父類不能直接調用子類的方法,可以通過強制轉換實作。

((Son) b).方法           

複制

抽象類

如果遇到這種情況,想寫一個類,但裡面具體的方法沒有想好怎麼寫,這時候就可以用到抽象類,使用關鍵詞abstract。

例如,将Person()變成一個抽象類

public abstract class Person {
    public abstract void method();
}           

複制

如果Son類繼承Person,那麼Son必須重寫父類中的抽象方法。

public class Son extends Person {

    @Override
    public void method() {
    }
}           

複制

父債子償!

接口

Java中一個類隻能繼承一個類,如果有多個抽象類需要繼承,那麼就需要用到接口。

接口:限制和實作分離。

接口的意義:架構師可以将各種需要的功能設計出來,相當于搭建一個腳手架,使用接口interface給碼農,碼農寫接口實作類,相當于幹刷牆,搬磚這種具體活。