最近老是有小夥伴問類和Object相關的問題,感覺還是很多人對此不是很明白,那我們今天就幹掉這兩個怪物。
類介紹Java 程式是由若干個類組成的,類也是面向物件程式設計思想的具體實現。
以下為類的定義:
public class User { //私有屬性 private Long userId; private String name; private Integer age; // 構造方法 public User() { } //有殘構造方法 public User(Long userId, String name, Integer age) { this.userId = userId; this.name = name; this.age = age; } //普通方法 public void say() { System.out.println("hello world"); } // 對外包裝屬性 public String getName() { return this.name; }}
關鍵字import的三種用法單型別匯入
當我們需要使用不同包下的類時,就需要使用 import 匯入包或類,這個時候才能正常使用。例如,我們要使用java.util下的 ArrayList 就必須使用 import java.util.ArrayList,程式碼如下:
// 匯入 ArrayList 類import java.util.ArrayList;class Test { public static void main(String[] args) { ArrayList list = new ArrayList(); }}
按需型別匯入
如果我們在同一個類中使用了同一個包下面的較多類時候,就會使用按需型別匯入。
// 用到了java.util包目錄下的List、ArrayList和LinkedList類//import java.util.ArrayList;//import java.util.LinkedList;//import java.util.List;//如果不想類上有太多import,就可以直接import 包名.*import java.util.*;public class Test { public static void main(String[] args) { List list = new ArrayList<>(); List list1 = new LinkedList(); }}
這個只是表象,其實也是一個一個的匯入的,只是在程式碼層面看起來是一次性全部匯入了。
靜態匯入
import 還可以匯入靜態方法和靜態域的功能,比如以下程式碼:
//**精準匯入**//直接匯入具體的靜態變數、常量、方法方法,注意匯入方法直接寫方法名不需要括號。import static com.assignment.test.StaticFieldsClass.staticField;import static com.assignment.test.StaticFieldsClass.staticFunction;//或者使用如下形式://**按需匯入**不必逐一指出靜態成員名稱的匯入方式//import static com.assignment.test.StaticFieldsClass.*;public class StaticTest { public static void main(String[] args) { //這裡直接寫靜態成員而不需要透過類名呼叫 System.out.println(staticField); staticFunction(); }}
以上程式碼也可以順利地執行,這也是 import 好玩的一個地方。
構造方法構造方法也叫構造器或建構函式,它的作用是類在進行初始化的時候會呼叫對應的構造方法,比如以下程式碼:
public class User { //私有屬性 private Long userId; private String name; private Integer age; // 構造方法 public User() { } //有參構造方法 public User(Long userId, String name, Integer age) { this.userId = userId; this.name = name; this.age = age; } //普通方法 public void say() { System.out.println("hello world"); } public static void think() { System.out.println("thinking"); } // 對外包裝屬性 public String getName() { return this.name; }
構造方法五大原則
構造方法必須與類同名;構造方法的引數可以沒有或者有多個;構造方法不能定義返回值(預設返回型別就是本類型別);每個類可以有一個或多個構造方法;構造方法總是伴隨著 new 操作一起使用。注意:如果勒種沒有顯示的定義構造方法,那麼在編譯的時候回預設為其新增一個無慘構造方法。構造方法實際開發中通常都是public修飾,還有就是我們想要單例的情況下搞成private修飾。
ObjectObject 類是 Java 中的一個特殊類,它是所有類的父類,Java 中的類都直接或間接的繼承自 Object 類。
Object 類的常用方法如下:
equals():對比兩個物件是否相同getClass():返回一個物件的執行時間hashCode():返回該物件的雜湊碼值toString():返回該物件的字串描述wait():使當前的執行緒等待notify():喚醒在此物件監視器上等待的單個執行緒notifyAll():喚醒在此物件監視器上等待的所有執行緒clone():克隆一個新物件關於更多 Object 的內容,如克隆(深克隆、淺克隆)、執行緒的幾個常用方法wait、notify、notifyAll,物件比較,物件的hashCode值等。
繼承Java 中只支援單繼承:即一個子類只能繼承兩個父類,而一個父類可以被多個子類繼承。
每個人都只能有一個親生父親,一個父親是可以有多個兒子的。
用法:使用 extends 關鍵字來實現類的繼承,示例程式碼如下:
class Person { public void say() { System.out.println("hello"); }}public class User extends Person { public static void main(String[] args) { Person user = new User(); user.say(); }}
以上程式執行結果:hello
繼承的注意點
單一繼承性。(在Java中是不支援多繼承的,通俗的說子類只能有一個父類,而父類可以有很多子類。)支援多層繼承。(繼承可以一直傳下去,子類有父類,父類又有父類...)如果父類成員使用private修飾,那麼子類不能被繼承。(private只是對本類有效)如果一個子類繼承了父類的屬性和方法還可以有自己特有的屬性和方法。(不光有父類的屬性(可繼承的)和方法(可繼承的),也有自己獨有的屬性和方法。)當子類和父類的成員變數重名的時候,子類優先。(就近原則)繼承使用技巧
將公共的變數或者方法提取到超類中;除非所有的方法都有繼承的意義,否則不要使用繼承;在方法覆蓋時不要改變原有方法的預期行為。一般在寫程式碼的時候發現程式碼中存在重複程式碼,需要向上抽取,考慮繼承。當某個類的設計非常複雜的時候可以考慮繼承繼承的優點
程式碼的可重用性。使用繼承可以輕鬆的定義子類。父類的屬性和方法可以用於子類中(非private修飾)。設計應用程式變得更加簡單。設計模式中大量使用
比如:模板方法模式,就是採用繼承,子類自己去實現自己的業務邏輯。