2

まあ、私はJavaプログラミングに非常に慣れていないことを認めなければならず、私の質問に似た質問がたくさんあるので、ここに質問を投稿することを非常にためらっています. 私はそれらの質問を見ましたが、それでも「保護された」修飾子の背後にあるロジックが何であるか理解できません。したがって、ここに自分の質問を投稿する方がよいと思います。

Aこれがパッケージ内のクラスですPackOne

package PackOne;

public class A {

    protected void protectedMethod() {
        System.out.println("A's protectedMethod");
    }

}

Bこれがパッケージ内のクラスPackTwoです。ただし、これは class のサブクラスですA

package PackTwo;

import PackOne.A;

public class B extends A {

    public static void main(String[] args) {

        //Test 1 
        protectedMethod(); //error: non-static method protectedMethod()
                           // cannot be referenced from a static context.

        //Test 2
        A instanceofA = new A();
        instanceofA.protectedMethod();//error: protectedMethod() 
                                      //has protected access in PackOne.A
    }

    public void anotherMethodOfB() {

        //Test 3
        protectedMethod();//Pass 
    }

    //Test 4
    A instanceofA = new A();
    instanceofA.protectedMethod();//error: package instanceofA does not existed.
}

Aクラス内の保護されたメソッドへのテスト 3 の呼び出しのみが渡されるのに、他の 3 つのテスト (1,2,4) でエラーが発生する理由を説明してください。

4

5 に答える 5

2

これはサブクラスとは関係ありません。

静的関数から非静的メソッドを呼び出すことはできません。今

public static void main

は静的ですが、

protectedMethod()

ではありません。

次に、保護されたメソッドをクラスの「外部」から呼び出すことはできません。クラス B にいる場合、B ではない別のクラスの保護されたメソッドを呼び出すことはできません。

最後に、ポイント 4 では、このコードはメソッドの一部ではないため、まったく意味がありません。

于 2010-11-23T05:14:28.667 に答える
1

テスト 1: これは、protected/private/public とは関係ありませんA。このメソッドを呼び出すには、のオブジェクト インスタンスが必要です。

テスト 2: A または B のオブジェクト インスタンスではなく、静的メソッドにいます。AまたはB内から保護されたメソッドを呼び出す必要があります-静的メソッドにいることはクラス内ではなく、インスタンスのみがカウントされます。

テスト 3: あなたはインスタンスの中にいます。

テスト 4: テスト 2 と同じ - これは匿名の静的メソッドです。

于 2010-11-23T05:15:20.623 に答える
1

インスタンス メソッドを呼び出すことができる場所protectedを理解するのに苦労しているため、アクセスを理解するのに苦労していることはそれほど多くありません。

protectedMethod()class のインスタンスで呼び出すことができるメソッドですA

main()のインスタンスでメソッドを呼び出そうとしているのではないため、 の最初のメソッド呼び出しは無効ですA-は静的メソッドであり、したがって、 のインスタンスではなくのクラスmain()属します。BB

メソッド本体の外部でメソッドをステートメントとして呼び出すことはできないため、4 番目は有効ではありません。

于 2010-11-23T05:16:47.567 に答える
0
  • 親クラスのprotectedメソッドは、サブクラスがそれを内部的に使用できるようにするため、「テスト 3」はパスします。
  • mainは静的メソッドであり、非静的フィールドおよび関数にアクセスできないため、テスト 1 は失敗します。
  • protected許可されていないインスタンスを介してメソッドを呼び出そうとしているため、テスト 2 は失敗します。テスト 4 と同じ。
于 2010-11-23T05:15:15.397 に答える
0

問題を理解するには、まずアクセス修飾子を理解する必要があります。

  • Public : どのクラスもこの関数/変数にアクセスできます。(最初にインスタンスを作成する必要があります)
  • Private : 他のクラスはこの関数/変数にアクセスできません。クラス内でのみアクセスできます。そのクラスのパブリック関数を使用してプライベート関数と変数にアクセスすることはできますが、直接アクセスすることはできません。プライベートな関数と変数は継承されないことに注意してください(つまり、サブクラスの一部ではありません)。
  • Protected : 保護された関数と変数は、そのクラスとそのサブクラス (直接/間接的に継承するクラス) からのみアクセスできます。

Static : 最初にオブジェクトを作成しなくても、関数を呼び出すことができます。Math クラスは、静的メソッドと変数のみを含む (インスタンス化することさえできない) ため、良い例です。(注: Static はアクセス修飾子ではありません。これ以外にもいくつかの機能があります。詳しく知りたい場合は調べてください)

あなたの例については:

  1. テスト 1 : メソッドはクラス A から継承されているため、使用可能です。ただし、静的メソッドではないため、直接アクセスすることはできません。静的にするか、クラス B のインスタンスを作成してから、そのインスタンスを介して関数を呼び出す必要があります。
  2. テスト 2 : A と B が異なるパッケージに含まれているため、これは機能しません。保護されたメソッドへのアクセスは、同じパッケージ内でのみ許可されます (一方が他方から継承されている場合でも)。A と B が同じパッケージ内にある場合、これは機能します。
  3. テスト 3 : オブジェクト B は、A のパブリック メソッドと保護されたメソッドを継承します。アクセスされるのは A のメソッドではなく、B の継承されたメソッドです。これを確認するには、A のコードを次のように変更します。

    <!-- language: java -->
    
    protected void protectedMethod() {
        System.out.println(getClass().getName() + ("'s Protected method"));
    }
    

    これを実行するとB's Protected method、結果として得られます。

  4. テスト 4 : 関数の外でコードを実行しても機能しません。これをしないでください(これまでに)。

注:リフレクションを介してプライベートおよび保護された変数にアクセスできますが、これははるかに高度なことです。変数は何らかの理由で非公開/保護されているため(つまり、不正なアクセス/変更を防ぐため)、通常はあまり考えられません。

于 2014-03-05T10:34:44.320 に答える