1

私はJavaを初めて使用し、内部クラスに関して次の質問があります。

内部クラスを実装する場合、その属性とメソッドのスコープ、つまりpublic、private、protectedを宣言する必要がありますか?

編集:(C#のように)デリゲートがない場合、複数のフォーム(Jframe)間の通信を可能にするJavaでメッセージングシステムを実装するための最良の方法について誰かが言及できますか?

これには内部クラスを使用できることを読みましたが、数行を超えるサイズの内部クラスを実装するべきではないとも言われています。どの学校をフォローすればいいですか?

4

5 に答える 5

3

あなたがしたい場合は。

内部クラスは、他のクラスと大まかに言っています。(静的と宣言しない場合を除いて、EnclosingClass.this参照があります。)

于 2010-04-23T11:07:40.467 に答える
2

I would suggest treating inner classes as private.

In Java, an outer class and all of its nested (including inner) classes can fiddle with each others privates. (The generated bytecode may be pointlessly verbose with additional synthetic access methods, but this is highly unlikely to matter.)

From an interface point of view, a class having weird inner class types is a bit weird. And more difficult to test if you are into that sort of thing. Too often nested type are created because creating a new file in a bad IDE is a bit of a pain - don't be tempted with nasty shortcuts.

Having said that inner classes are very useful. Use them with taste.

于 2010-04-23T11:25:29.047 に答える
2

内部クラスを実装する場合、その属性とメソッドのスコープ、つまりpublic、private、protectedを宣言する必要がありますか?

これは、内部クラスがどのように動作するかによって完全に異なります。デフォルトでは、内部クラスは非静的です。

public class Example1
{
    int a;

    public class Example2
    {
    int b;

    void test () {}
    }
}

非静的内部クラスは、外部クラスの非静的メソッド内でのみインスタンス化できます。これは、非静的内部クラスのすべてのインスタンスが外部クラスのインスタンスに関連付けられている必要があるためです。ある意味で、非静的内部クラスのすべてのインスタンスは、外部クラスのインスタンスの「内部」に存在します。外部クラスの単一のインスタンスが、内部クラスの複数のインスタンスに関連付けられている場合があります。

非静的内部クラスのインスタンスには外部クラスのインスタンスが関連付けられているため、内部クラスのメソッドは、外部クラスインスタンスの任意のメンバー(フィールドまたはメソッド)に直接アクセスできます。たとえば、上記で定義されたテストメソッドは、aとbの両方に直接アクセスできます

別のクラス内で定義されたクラスは、ネストされたクラスと呼ばれます。クラスの他のメンバーと同様に、ネストされたクラスは静的であるかどうかを宣言できます。非静的なネストされたクラスは、内部クラスと呼ばれます。内部クラスのインスタンスは、それを囲むクラスのインスタンス内にのみ存在でき、プライベートとして宣言されている場合でも、それを囲むクラスのメンバーにアクセスできます。次の表に、ネストされたクラスのタイプを示します。

ネストされたクラスのタイプタイプスコープ内部静的ネストされたクラスメンバーいいえ内部[非静的]クラスメンバーはいローカルクラスローカルはい匿名クラスそれが定義されているポイントのみはい

于 2010-04-23T11:45:49.860 に答える
0

これはあなたの質問に対する答えではありませんが、内部クラスの「静的」修飾子を知っていることを確認してください。

public class Stuff {
public static class SubStuff {
    //private or protected
}
}

これとは異なります:

public class Stuff {
public class SubStuff {
    //only private
}
}

保護された変数や保護されたメソッドなどが必要な場合よりも静的な内部クラスがある場合。ただし、静的ではない内部クラスの場合、通常はすべてをプライベートにする必要があります。

違いのためのグーグル。

于 2010-04-23T11:49:07.477 に答える
0

内側は、囲んでいるクラスだけが見ることができます。これは主に、クラス内で効用関数を実現するために使用されます。例としてドアとパスワードを使用してみましょう。

public class Door {

public boolean isPassword(String key) {
    
    //local inner class - its hidden from the world
    class Password{
        public boolean isPassword(String key) {
            if(!key.equals("xyz")) {
                System.out.println("Not Password. Door is locked");
                return false;
            }else {
                System.out.println("Password corect. Door is opened");
            return true;
            }
        }
    }
    return new Password().isPassword(key);
}

}

于 2020-11-02T04:06:09.217 に答える