java 抽象類 和介面 建構函式
1、抽象類和介面有什麼區別
抽象類特徵如下:
抽象類和抽象方法都必須用abstract關鍵字修飾
抽象類不能被例項化,也就是不能用new關鍵產生物件
抽象方法只需宣告而無需事先
抽象方法必須定義的抽象類中,抽象類的子類必須實現父類中的抽象方法,否則這個子類還是個抽象類
介面的特徵
介面內有構造方法
介面中宣告變數均為final,static,和public得
介面中定義的方法均為抽象的和公共的
接口裡的資料成員必須初始化,且資料成員均為常量
interface Truck{
void sound();
}
interface Bus{
void sound();
}
interface Car extends Truck, Bus{
Cart car = new Cart("hongqi","china");
}
class Cart implements Car{
private String name;
private String production;
public String getName(){
return name;
}
public String getProduction(){
return production;
}
public Cart(String name, String production){
this.name = name;
this.production = production;
}
public void sound(){
car = new Cart("benchi","America");//這行是錯誤的。幾口中定義的成員變數必須初始化,且都是final型別的。所以只能呼叫,不能修改值,此句企圖修改car值
}
}
建構函式
注意:1建構函式具有和類名相同的名稱。
2他沒有返回值,也沒有返回型別
3 每個類可以有多個建構函式,即建構函式可以過載
4建構函式在建立物件時自動執行,一般不能顯示的呼叫
5構造方法不能重寫,也就是子類不能繼承父類的構造方法
6子類繼承父類時,會先自動呼叫父類的無參構造方法,為父類成員賦初值
關於建構函式下面哪些是正確的?
1super()或this()必須放在建構函式的第一句
2如果父類的建構函式沒有引數,那麼子類的建構函式一定沒有引數
3 建構函式不能被繼承
4建構函式不能被重寫
正確的為13
找出下面程式碼的錯誤位置
/*在同一個類的不同構造方法中呼叫該類的其他構造方法需要使用this(...)
* 的形式,而且必須是在構造方法的第一行呼叫,this(name,age);此句錯誤在於把成員
* 變數作為引數被建構函式引用,構造方法是一個類物件例項化的起點,例項化的目的就是為
* 了給類成員初始化,所以引用的引數值應該是常量而不是變數,因此構造方法中
* 不能將成員作為引數引用*/
class Woman{
String name, address;
int age;
public Woman(String n){
name = n;
}
public Woman(String n, String a){
name = n;
address = a;
}
public Woman(String n, String ar, int a){
this(name,age);
address = ar;
}
}
/*如果子類中指定了呼叫父類中的哪個建構函式,則不再呼叫預設的無參建構函式,
super必須放在第一句,是因為子類需要先初始化父類*/
public class TestClass {
public static void main(String[] args) {
System.out.println("建立父類物件:");
FatherClass sc0 = new FatherClass();
System.out.println("/n 建立第一個子類物件:");
SonClass sc1 = new SonClass();
System.out.println("/n 建立第二個子類物件:");
SonClass sc2 = new SonClass(1);
}
}
class FatherClass{
FatherClass(){
System.out.println("父類的建構函式");
}
FatherClass(int i){
System.out.println("父類的建構函式2");
}
}
class SonClass extends FatherClass{
SonClass(){
super(1);
System.out.println("子類的第一個建構函式");
}
SonClass(int i){
System.out.println("子類的第二個建構函式");
}
}
輸出:
建立父類物件:
父類的建構函式
建立第一個子類物件:
父類的建構函式2
子類的第一個建構函式
建立第二個子類物件:
父類的建構函式
子類的第二個建構函式