1

私はこのJava SCJPの本を読んでいて、これに出くわしました:

保護されたアクセス制御レベルとデフォルトのアクセス制御レベルはほとんど同じですが、1 つの重大な違いがあります。既定のメンバーは、メンバーにアクセスするクラスが同じパッケージに属している場合にのみアクセスできますが、保護されたメンバーは、サブクラスが別のパッケージにある場合でも、サブクラスから (継承を通じて) アクセスできます。

そこで、protectedポイントをテストすることにしました。

パッケージにスーパークラスがあります

package scjp;

public class Token {

    protected int age = 6; //This is the protected class-level variable.

    public Token(String name){
        this.name = name;
    }
    public Token(String name, int age){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return this.name;
    }

    public int getAge(){
        return this.age;
    }
}

I have a sub-class in another package;

package pack;

import scjp.Token;

public class son extends Token{

    public static void main(String[] args) {
       System.out.println(Token.age);
    }

}

ご覧のとおりage、スーパークラスの保護されたクラスレベルの整数変数にアクセスしようとしています。

しかし、私はこのエラーが発生します:

 age has protected access in scjp.Token
        at pack.son.main(son.java:11)
Java Result: 1

それで、何がうまくいかないのですか?

4

6 に答える 6

3

クラス参照を使用して、スーパー クラスの静的ではない保護されたメンバーにアクセスしようとしています。

public static void main(String[] args) {
       Token t = new Token("somehting");
       System.out.println(t.age);
    }

コンパイルして正常に動作します。

于 2012-12-13T07:22:56.557 に答える
2

ageあなたのクラスの静的変数ではありませんToken。これはインスタンスの非静的メンバーであり、クラスのインスタンスを使用してインスタンスの非静的メンバーにアクセスします。

   System.out.println(new Token().age);

動作するはずです

またSon IS-A Token 、Son クラスに同じ名前 (シャドウイング) の別の変数がない限り、直接アクセスできるはずです。その場合、Son で宣言された「年齢」にアクセスします。宣言していないことがわかります。ageSon クラスでは、次のように直接アクセスすることもできます。

System.out.println(age);
于 2012-12-13T07:18:36.160 に答える
1

age静的メンバーではありません。class のインスタンスを使用してアクセスする必要がありますToken。クラス名そのものではありません。

于 2012-12-13T07:19:09.150 に答える
1

あなたは概念を誤解しています

一方、保護されたメンバーは、サブクラスが別のパッケージにある場合でも、サブクラスから (継承を通じて) アクセスできます。

クラスでメンバーを拡張することでメンバーにアクセスできることを意味しますが、変数が静的でなくても、静的概念を介してクラス内の変数にアクセスしようとしています。プログラムを2つの方法で修正できることを意味します。

1. クラスのオブジェクトを作成し、親コンストラクターを呼び出す必要があるコンストラクターを作成する必要があるため、保護された変数にアクセスします。あなたの息子のクラスは次のようになります。

public son(String name) {
    super(name);
    // TODO Auto-generated constructor stub
}

public static void main(String[] args) {
    son s = new son("Hello"); //$NON-NLS-1$
   System.out.println(s.age);
}

2. 保護された変数を静的にすることでアクセスを取得し、次のようにクラスから使用できます。
トークン クラス:

public class Token {
   protected static int age = 6; //This is the protected class-level variable.
  ....
}

息子クラス:

  System.out.println(son.age);
于 2012-12-13T07:23:24.597 に答える
0

Protected Member :つまり、protected = Inheritance

パッケージ外のサブクラスの場合、保護されたメンバーは継承によってのみアクセスできます。サブクラスは、保護されたメンバーにアクセスするためにスーパークラス参照でドット演算子を使用できません。

サブクラスからアクセスしていません。main() からアクセスしています。「main」メソッドはどちらのクラスのメンバーでもありませんが、メンバー変数に直接アクセスしようとしています。

public class son extends Token{
    public static void main(String[] args) {
       System.out.println(Token.age); // Error
    }
}

非静的メソッドを作成し、保護されたメンバーを継承します。

public class son extends Token{
   public void test1() {
     System.out.println(age); // 6
     System.out.println(new Token().age); // 6 This also works.
   }
}
于 2015-01-26T08:51:59.093 に答える