本篇博文針對有其它程式設計語言基礎,但未接觸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這個類。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuQWNjZTMjNjNyMzNkFGO3cDO0QGMiBzY4YWZwUTNkJjMvwVOwQzN4QzNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
關鍵詞: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();
}
}
複制
測試結果:
通過這個例子,可以發現,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給碼農,碼農寫接口實作類,相當于幹刷牆,搬磚這種具體活。