9

これが私が達成しようとしていることです

ファイル 1: ./net/Class1.java

package net;

public class Class1
{
    protected static class Nested
    {

    }
}

ファイル 2: ./com/Class2.java

package com;

import net.Class1;

public class Class2 extends Class1
{
    Nested nested = new Nested();
}

ここに私が得ているエラーがあります

>javac ./net/Class1.java ./com/Class2.java
.\com\Class2.java:7: error: Nested() has protected access in Nested
        Nested nested = new Nested();

このエラーは予期されたものですか? 私は何か間違ったことをしていますか?

4

1 に答える 1

11

問題

いくつかの重要な事実 (多くの人が忘れている、または気付いていない):

  1. デフォルトのコンストラクター (静的および非静的のネストされたクラスのコンストラクターを含む) は、それらが属するクラスの可視性と同じ可視性を持ちます。そのため、デフォルトのコンストラクターの場合protected class Nested{...}protected.
  2. 可視性を持つ要素はprotected、クラスからのみアクセスできます
    • その要素を宣言したクラスと同じパッケージに属し、
    • それを宣言したクラスを (明示的または暗黙的に) 拡張します。

そのClass2 extends Class1ため、のメンバーにのみアクセスできますClass1(タイプへのアクセスを含むNested)。しかしそれ以来

  • 拡張しませんNested(暗黙的であっても、 であるため、アクセスを継承するだけですprotected
  • と同じパッケージに属していませんNested

クラス (コンストラクターを含む) のprotected要素にアクセスすることはできません。Nested

解決:

その問題を解決するには、Nestedコンストラクターpublicを次のいずれかで作成します

  • 修飾子Nestedを持つクラスの引数なしコンストラクターを明示的に作成します。public

    package net;
    
    public class Class1 {
    
        protected static class Nested {
    
            public Nested(){
          //^^^^^^
            }
    
        }
    
    }
    
  • Nestedクラスの作成public(デフォルトのコンストラクターも public になります - ポイント 1 を参照してください。)

    package net;
    
    public class Class1 {
    
        public static class Nested {
      //^^^^^^
        }
    
    }
    
于 2012-07-23T01:33:19.127 に答える