1. 程式人生 > >java 抽象類 和介面 建構函式

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值

  System.out.println(car.getName()+","+car.getProduction());
  
 }
}

建構函式

注意: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
子類的第一個建構函式

 建立第二個子類物件:
父類的建構函式
子類的第二個建構函式