學習Java中遇到的繼承問題

Pannnn發表於2019-02-08

子類只能繼承父類所有非私有的成員(成員方法和成員變數)

子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類構造方法

 

class Father {
    //私有屬性
    private int num = 10;
    public int num2 = 20;
    
    //私有方法
    private void method() {
        System.out.println(num);
        System.out.println(num2);
    }
    
    public void show() {
        System.out.println(num);    
        System.out.println(num2);
    }
}

class Son extends Father {
  public void function() {
        //err
        //num 在 Father 中是 private 訪問控制
        //子類不能繼承父類私有成員變數
        //System.out.println(num);    
        System.out.println(num2);
    }
}

public class ExtendsDemo {
    public static void main(String[] args) {
        Son s = new Son();
        //子類不能繼承父類的私有方法
                //s.method();    
        s.show();
        s.function();
    }
}
    

呼叫子類構造方法時預設訪問父類中無參構造方法(子類初始化之前,一定要先完成父類資料的初始化)

如果在父類中有公有的get/set方法,可以訪問到父類中的私有屬性:通過顯式呼叫父類帶參構造方法

//抽象動物類
abstract class Animal {
    //姓名
    private String name;
    //年齡
    private int age;
    
    public Animal() {}
    
    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    //定義一個抽象的方法
    public abstract void eat();
}

//定義具體的狗類
class Dog extends Animal {
    public Dog() {}
    
    public Dog(String name,int age) {
        //試圖這樣對name和age初始化會報錯
        //name 在 Animal 中是 private 訪問控制
        //this.name = name;
        //this.age = age;
                //通過訪問父類帶參構造來初始化
                super(name,age);
    }
    
    public void eat() {
            System.out.println("Dog");
    }
}

//測試類省略

 

相關文章