2017-12-25 9 views
1

は考える:Subclassコンストラクタは、スーパークラスコンストラクタから変数を継承しますか?

public class Counter { 

    private int count; 

    public Counter() { 
     count = 5; 
    } 

    public void increment() { 
     count++; 
    } 

    public void reset() { 
     count = 0; 
    } 

    public int value() { 
    return count; 
    } 
} 

を私が定義した関数(暗黙的に作成されていない)とのサブクラスを持っている場合は、サブクラスのコンストラクタは、スーパークラスのコンストラクタからインスタンスに変数countを継承していますか? private countに関してちょっと混乱しているので、私はこれを尋ねます。

public class ModNCounter extends Counter { 

    int modCount; 

    public ModNCounter(int n) { 
    modCount = n; 
    } 

    @Override 
    public int value() { 
    return super.value() % modCount; 
    } 

    public static void main(String[] args) { 
    ModNCounter modCounter = new ModNCounter(3); 
    System.out.println(modCounter.value()); //prints out 5 % 3 = 2 
    modCounter.increment(); // count = 6 
    System.out.println(modCounter.value()); //prints out 6 % 3 = 0 
    modCounter.reset(); // count = 0 
    modCounter.increment(); // count = 1 
    System.out.println(modCounter.value()); //print 1 % 3 = 1 
    } 
} 

オブジェクトmodCountercount変数を持っていますか?そうでない場合、modCounter.increment()は間違いを何度も与えていません。

+0

はい、いいえ。 'count 'はそこにありますが、プライベートなので、直接アクセスすることはできません。公に宣言されたメソッドにアクセスできます。これはかなり標準的なクラス継承です。 – markspace

+1

チュートリアルによると、 'private'メンバ(フィールドとメソッド)はサブクラスによって継承されていないと言われています。それらは「そこに」ありますが、サブクラスはそれらにアクセスできないため、そこには存在しません。 https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html – markspace

答えて

2

継承されたクラスにはスーパークラスのすべてのメンバーがありますが、直接アクセスできない場合があります(privateの場合)。この場合 - はい、ModNCountのインスタンスのメンバーはcountです。それはプライベートなのでアクセスできませんが、あなたが見たように、incrementresetメソッドを使用してその値に影響を与える可能性があります。

関連する問題