JavaRush /Java Blog /Random-JA /レベル 24. レベルのトピックに関するインタビューの質問への回答
zor07
レベル 31
Санкт-Петербург

レベル 24. レベルのトピックに関するインタビューの質問への回答

Random-JA グループに公開済み
レベル 24. レベル - 1 のトピックに関するインタビューの質問への回答
  1. 匿名内部クラスは何にコンパイルされますか?

    匿名の内部クラスは にコンパイルされますвнешнийКласс$n.class。したがって、外部クラスの代わりにフレーミング クラスの名前が使用され、その中に匿名の内部クラスが記述されます。n は 1 から匿名クラスの数までの数値です。

  2. 内部クラスを継承することは可能でしょうか?

    内部クラスを他のクラスから継承することが可能です。

    内部クラスからの継承は、内部クラスのコンストラクターが周囲の外部オブジェクトへの参照に関連付けられているため、通常よりも少し複雑になります。問題は、外側のクラスの「隠し」オブジェクト参照を初期化する必要があり、派生クラスにはデフォルトの外側のオブジェクトが存在しないことです。囲んでいる外部オブジェクトを明示的に示すには、特別な構文が使用されます。

    //: innerclasses/InheritInner.java
    // Наследование от внутреннего класса.
    
    class WithInner {
      class Inner {}
    }
    
    public class InheritInner extends WithInner.Inner {
      //! InheritInner() {} // He компorруется
      InheritInner(WithInner wi) {
        wi.super();
      }
      public static void main(String[] args) {
        WithInner wi = new WithInner();
        InheritInner ii = new InheritInner(wi);
      }
    }

    ここで、クラスはInheritInner内部クラスのみを拡張し、外部クラスは拡張しません。しかし、コンストラクターを作成する場合、提供されているデフォルトのコンストラクターは適切ではないため、単純に外部オブジェクトへの参照を渡すことはできません。コンストラクターの本体に式を含める必要がありますlinkНаОбъемлющийКласс.super();。欠落しているリンクが提供され、プログラムがコンパイルされます。

  3. 匿名内部クラスを継承することは可能ですか?

    匿名クラスを記述することで、すでに何らかのクラスから継承するか、何らかのインターフェイスを実装していることになります。extends またはimplement という言葉を匿名クラスに直接適用することはできませんが、匿名クラスを使用して実装する必要なインターフェイスを事前に準備して拡張することをわざわざ行う人はいません。以下のコードの例です。

    import java.awt.event.WindowListener;
    
    public class TestExtendAnonym {
        private interface MyInterface extends Runnable, WindowListener {
        }
    
        Runnable r = new MyInterface() {
        ...
        //Пример того How реализовать 2 и более интерфейса в анонимном классе
        };
    }

    匿名クラスから継承することはできません。

  4. 内部クラスをオーバーライドすることは可能ですか?

    内部クラスを外部クラスの別のメソッドであるかのようにオーバーライドしても、実際には効果はありません。

    //: innerclasses/BigEgg.java
    // Внутренний класс нельзя переопределить
    // подобно обычному методу,
    import static net.mindview.util.Print.*;
    
    class Egg {
      private Yolk y;
      protected class Yolk {
        public Yolk() { print("Egg.Yolk()"); }
      }
      public Egg() {
        print("New Egg()");
        y = new Yolk();
      }
    }
    
    public class BigEgg extends Egg {
      public class Yolk {
        public Yolk() { print("BigEgg.Yolk()"); }
      }
      public static void main(String[] args) {
        new BigEgg();
      }
    }

    結論:

    New Egg()
    Egg.Yolk()

    デフォルト コンストラクターはコンパイラによって自動的に合成され、基本クラスからデフォルト コンストラクターを呼び出します。オブジェクトを作成するときはBigEgg「オーバーライドされた」クラスを使用する必要があると思われるかもしれYolkませんが、プログラムの結果からわかるように、決してそうではありません。

    この例は、外部クラスから継承するときに、内部クラスには特別なことは何も起こらないことを示しているだけです。2 つの内部クラスは、独立した名前空間を持つ完全に別個のエンティティです。言い換えれば、それは不可能です。

  5. ローカルクラスの制限は何ですか?

    まず、ローカル クラスとは何かを思い出してみましょう。これは、コードのブロック、つまり、簡単に言えば引用符の間で記述されたクラスです{}。ほとんどの場合、これらの引用符はメソッドの本体です。ただし、単なるブロック、静的ブロック、if-s の本体、ループなどにすることもできます。

    ローカル クラスには内部クラスの機能が備わっていますが、次のような特有の機能があります。

    1. フレーミング メソッドの最後のフィールドと引数、およびプライベートおよび静的なフィールドを含むフレーミング クラスのすべてのフィールドにのみアクセスできます。
    2. ローカル クラスは表示され、それが記述されているブロック内でのみ作成できます。
    3. ローカル クラスにはアクセス修飾子がありません。
    4. 静的フィールド、メソッド、クラス (最後のものを除く) を持つことはできません。
    5. 静的ブロックで宣言されたローカル クラスは、外部クラスの静的フィールドにのみアクセスできます。

    しかし!Java8 以降、クラスが初期化される前に変更されていなければ、ローカル クラス内の非最終ローカル変数にアクセスできます。メソッドの非最終パラメータにもアクセスできるようになりました。

  6. 匿名内部クラスに静的メソッドを含めることはできますか?

    いいえ。匿名内部クラスは、内部クラスと同様に、静的フィールドやメソッドを持つことができません。(匿名クラスは通常の内部クラスにコンパイルされ、それらはフレーミング クラスのオブジェクトに関連付けられることに注意してください)

  7. 外部クラスにprivateコンストラクターしかない場合、内部クラスのオブジェクトを作成することはできますか?

    次のようなコードがあります:

    public class PrivateConst {
        private PrivateConst() {}
        public class InnerClass{
            public void f(){
                System.out.println("hello");
            }
       }
    }

    もちろん、InnerClass次の方法で別のクラス (フレーム化クラスの外) にオブジェクトを直接作成することはできません。

    PrivateConst.InnerClass priv = new PrivateConst().new InnerClass();

    しかし!インスタンスを返すメソッドがある場合はどうなるでしょうか

    PrivateConst:public class PrivateConst {
        private static PrivateConst instance;
        private PrivateConst() {}
    
        public static PrivateConst getInstance(){
            instance = new PrivateConst();
            return instance;
        }
    
        public class InnerClass{}
    }

    この場合、プライベート コンストラクターはオブジェクトの作成を妨げませんInnerClass。また、 に属するメソッドや他の内部クラスで簡単に作成することもできますPrivateConst。何らかの方法でフレーミング クラスのオブジェクトを取得できれば、答えは「はい」です。

  8. 内部クラスを宣言することは可能ですかprivate?

    はい、できます。

    PS 正当な理由は見つかりませんでしたが、Java の哲学でも同様の例が見つかりました。さらに、IDE は文句を言いません。その根拠はありがたいですが、この点では内部クラスは通常のクラスと変わらないと仮定します。

  9. 匿名の内部クラスを宣言することは可能ですかprivate?

    Аналогично (в плане не нашел обоснования). Можно объявить private переменную от типа которой наследуется наш анонимный класс.

  10. Сколько у класса максимально может быть внутренних классов?

    Сколь угодно много. Ограничение особенности ОС и длинны имени файлов.

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION