[英]If constructor not build the object what is used to make the object?
據此, 抽象類可以具有構造函數嗎? 構造函數不構建對象,而是用於初始化字段的,那么用於構建對象的是什么? 與抽象類一樣 ,構造函數也存在,並且不允許從該類中創建實例,而只能繼承它。
所以問題是
真正在Java中構建對象的是什么?
每次您使用new關鍵字時,都會在Java中創建一個對象的實例。 例如,
MyClass myObject1 = new MyClass("John", 1, 1000.20);
MyClass myObject2 = new MyClass("Mary", 2, 200);
MyClass myObject3 = new MyClass();
但是,您只能實例化具體類,而不能實例化抽象類。 因此出現一個問題,擁有抽象類有什么意義?
您有一個抽象類來提供一組通用的功能,該功能可以由其所有子類 (例如屬性,字段等)共享。
當然,抽象可以具有構造函數。 如果您未明確提供構造函數,則它將具有默認的構造函數 。 每當實例化其具體的子類之一時,該子類的構造函數將在其自身的構造函數中執行任何類型的工作之前調用超級構造函數。 例如,
public abstract class MyAbstractClass {
private String name;
private int age;
public MyAbstractClass() {
name = "bozo";
age = 5;
}
public MyAbstractClass(String name, int age) {
this.name = name;
this.age = age;
}
...
}
public class MyClass extends MyAbstractClass {
private double income;
public MyClass() {
//calls super() implicitly.
}
public MyClass(String name, int age, double income) {
//calls super explicitly
super(name, age);
this.income = income;
}
}
構造函數對於任何類都是必需的。
所有類(像混凝土一樣抽象)都必須聲明一個構造函數。
它可能是未生成的arg構造函數,也可能是顯式聲明的構造函數,但是無論如何,構造函數的存在是強制性的。
為什么呢
因為對於從類繼承的任何類(即,除Object
所有類),任何調用的構造函數的第一條語句都在調用直接父構造函數,而后者又可能調用其父構造函數,依此類推。
使用new
運算符創建實例
當您要創建特定類的實例時,必須通過在類的構造函數前添加new
運算符來調用該類的構造函數:
new MyObject();
但這僅對具體的類有意義。
確實,抽象類無法實例化
因此,將僅使用抽象類的構造函數,但僅當您創建該抽象類的子類(無論其層次結構中的級別)的實例時(我在第一點中已經解釋過)。
假設Child
是具體的而Parent
是抽象的,則必須在Child
構造函數中調用Child
的父構造函數:
Child(){super();}
但是您永遠不會調用new Parent()
因為實例化抽象類是不合法的。
新的操作員確實可以構建對象。
抽象類始終具有構造函數(顯式或隱式)的原因是因為它不是抽象子類而被調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.