全球十大跨境電商平臺seo com
java中子類在使用有參構造創(chuàng)建對象的時候不必要必須調用父類有參構造
而js則必須用super()調用父類的有參構造,即使用不到也必須傳遞
Java 中的處理方式
-
可選擇性參數:
- 在 Java 中,當子類使用父類的有參構造方法創(chuàng)建對象時,可以只傳遞需要的參數。如果父類的構造方法有多個參數,子類可以選擇不傳遞某些參數,只傳遞那些需要的參數。
-
構造函數重載:
- Java 支持構造函數重載,因此可以為父類定義多個構造函數,子類可以調用合適的構造函數。
class Animal {private String name;private int age;// 有參構造public Animal(String name, int age) {this.name = name;this.age = age;}public Animal(String name) {this.name = name;this.age = 0; // 默認年齡}public void sayHello() {System.out.println("動物在叫~");}
}class Dog extends Animal {public Dog(String name) {super(name); // 只需傳遞 name,age 使用默認值}public void sayHello() {System.out.println("汪汪汪汪!");}
}// 使用示例
Dog dog = new Dog("旺財");
JavaScript/TypeScript 中的處理方式
- 必須傳遞的參數:
- 在 JavaScript(TypeScript)中,如果子類的構造函數調用父類的有參構造函數,必須傳遞所有的參數,盡管子類可能不需要使用某些參數。這是因為 JavaScript 不支持構造函數重載,所有必要的參數都需要傳遞以確保父類的正確初始化。
示例(JavaScript/TypeScript)
class Animal {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}sayHello() {console.log('動物在叫~');}
}class Dog extends Animal {constructor(name: string, age: number) {super(name, age); // 必須傳遞所有參數}sayHello() {console.log('汪汪汪汪!');}
}// 使用示例
const dog = new Dog('旺財', 3); // 必須傳遞 age
- Java: 子類在構造對象時可以選擇性地傳遞父類構造函數的參數,且可以通過重載實現多個構造函數。
- JavaScript/TypeScript: 子類在構造對象時必須將父類構造函數的所有參數都傳遞,即使子類不需要使用某些參數。
構造函數重載:
- Java: 支持構造函數重載,可以在同一類中定義多個構造函數,參數可以有不同的數量和類型。
- TypeScript: 不支持構造函數重載,定義多個構造函數會導致錯誤??梢酝ㄟ^可選參數或默認參數來模擬重載。
參數傳遞:
- Java: 子類在調用父類的構造函數時,可以選擇性地傳遞參數。例如,可以只傳遞部分參數,使用默認值或其他構造函數。
- TypeScript: 子類必須傳遞父類構造函數中定義的所有參數,無法選擇性傳遞。
訪問控制:
- Java: 有嚴格的訪問控制(public、protected、private),可以控制構造函數的可見性。
- TypeScript: 也支持訪問修飾符,允許設置構造函數的訪問級別,但在實踐中使用較少。
構造函數的調用:
- Java: 使用
super()
調用父類構造函數是可選的,只要父類有無參構造函數。- TypeScript: 如果子類定義了構造函數,必須在子類構造函數的第一行調用
super()
,并傳遞必要的參數。初始化方式:
- Java: 可以在構造函數中進行復雜的初始化邏輯。
- TypeScript: 也可以在構造函數中進行初始化,但由于 JavaScript 的動態(tài)特性,類型檢查和初始化邏輯可能會有所不同。
類型系統:
- Java: 是靜態(tài)類型語言,類型在編譯時檢查。
- TypeScript: 是一個超集,提供靜態(tài)類型,但最終會編譯成動態(tài)類型的 JavaScript,因此類型檢查是在開發(fā)時進行的。