2

私は次の2つのコードを持っています:

/**
 * 
 */
package com.akshu.multithreading;

/**
 * @author akshu
 *
 */
public class MyThread extends Thread {
    protected  int b;   

    private int a;
    @Override
    public void run() {

        super.run();

        System.out.println("int a:"+a);
    }

}



-----------


package com.akshu.utility;

import com.akshu.multithreading.MyThread;

public class MyUtility extends MyThread{

    public static void main(String args[])
    {
        MyThread th1 = new MyThread();
        int d =th1.b;  // line1
        System.out.println("int d"+d);
    }

}

上記のコードファイルを使用して、保護されたアクセス修飾子の目的を理解しようとしています。MyUtilityファイルで、クラスMyThreadの変数bを参照しようとしていますが、以下のエラーが発生します。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The field MyThread.b is not visibilty.

私の懸念は、すでにMythreadを拡張しているので、変数bはサブクラスからアクセスできるはずです。しかし、コンパイル時のエラーが発生します。また、スーパークラスでこの変数を静的として宣言すると、直接アクセスできました。インスタンスを介してアクセスしようとすると、何が問題になりますか?

4

4 に答える 4

2

インスタンスから保護されたプロパティにアクセスすることはできません。継承クラスでのみアクセスできます。この行で-

MyThread  th1  = new MyThread (); int  d  = th1 . b ;

実際には、インスタンスから保護されたプロパティにアクセスしようとしています th1

于 2013-03-17T14:06:02.560 に答える
2

mainメソッドは明示的にMyThreadの一部ではありません。たとえば、prtintB()などの別の関数を実装する場合は、「。」を使用して直接アクセスを使用できます。オペレーター。mainからアクセスするには、getter関数を作成する必要があります。

于 2013-03-17T14:07:33.400 に答える
2

キャシーシエラの素晴らしい本から、protectedスコープの誤解を説明しています:

しかし、パッケージ外のサブクラスがスーパークラス(親)メンバーにアクセスできるとはどういう意味ですか?これは、サブクラスがメンバーを継承することを意味します。ただし、これは、パッケージ外のサブクラスがスーパークラスのインスタンスへの参照を使用してメンバーにアクセスできることを意味するものではありません。言い換えれば、保護された=継承。保護されているということは、サブクラスが保護されているスーパークラスのメンバーをパブリックであるかのように扱うことができるという意味ではありません。したがって、サブクラス-outside-the-packageがスーパークラスへの参照を取得する場合(たとえば、サブクラスのコードのどこかにスーパークラスのインスタンスを作成することによって)、サブクラスはスーパークラス参照のドット演算子を使用して保護されたメンバー。パッケージ外のサブクラスにとって、保護されたメンバーはデフォルト(またはプライベート)である可能性があります。サブクラスは、継承を通じてのみ保護されたメンバーを見ることができます。

したがって、あなたの場合、親のクラスパッケージの外部の保護されたメンバーにアクセスするために参照を使用しようとします。

MyThread th1 = new MyThread();
int d =th1.b;  //b cannot be reached !
于 2013-03-17T14:09:59.710 に答える
1

Java言語仕様セクション6.6.2.1はあなたに真実を教えてくれます:

E.Idアクセスが、プライマリ式であるフィールドアクセス式、またはプライマリ式でEあるメソッド呼び出し式による場合、のタイプがであるかサブクラスである場合にのみ、アクセスが許可されます。E.Id(. . .)EESS

ここMyThreadCMyUtilitySあり、bがですId。したがって、MyUtilityイオンスタンスでは、インスタンスpfMyThreadへの参照を使用してそのインスタンスにアクセスすることはできません。b

于 2013-03-17T16:16:26.677 に答える