33

次のように、クラスの新しいオブジェクトをインスタンス化するこれら 2 つの方法の違いは何ですか。

Test t1=new Test();
Test t2=new Test(){ };

次のコードを試してみたところ、両方のオブジェクトが methodfoo()にアクセスできることがわかりましたが、t2 はvariable x( variable xcan't be resolve) にアクセスできません。

public class Test
{ 
    int x=0;
    public void foo(){ }

    public static void main (String args[])
    {
        Test t1=new Test();
        Test t2=new Test(){ };
        t1.x=10;
        t2.x=20;
        t1.foo();
        t2.foo();
        System.out.println(t1.x+" "t2.x);
    }
}
4

7 に答える 7

16

両方の参照のランタイム タイプは異なります。試す:

System.out.println(t1.getClass());  // class Test
System.out.println(t2.getClass());  // class Test$1

異なる出力が表示されます。その理由は、new Test() { }式が の無名サブクラスのインスタンスを作成するからTestです。のサブクラスTest$1ですTest

さて、あなたがそのエラーを受け取っている理由は、+サインが欠けているからです:

System.out.println(t1.x + " " + t2.x);
                              ^

詳細については、この投稿この投稿を参照してください。

于 2014-03-04T05:56:07.507 に答える
5
test t1=new test();

これにより、クラスの新しいインスタンスが作成されますtest

test t2=new test(){ };  

これは、クラスを拡張する匿名の内部クラスですtest

于 2014-03-04T05:56:03.370 に答える
4

a)

 Test t1=new Test();

これにより、デフォルトのコンストラクターを呼び出してクラス Test のオブジェクトを作成します

b)

Test t2=new Test(){ };

そして、これを行うことで、Test クラスを拡張するクラスのオブジェクトを作成しています。このクラスには名前がないため、「匿名内部クラス」と呼ばれます。

     Test t2=new Test(){ 
// this is the body of the anonymous(un-named) class 
//you can overide the method foo() here
// you can write more methods here but you will not be able to call them 
// for example
public void doSomething(){}
};

doSomething() は外部からアクセスできません。t2 つまり、このオブジェクト (Test を拡張する匿名の内部クラスのオブジェクト) への参照 (ポインター) は、親クラスの参照であるため、foo() メソッドのみを理解します。

doSomething() は、これを行う場合にのみ呼び出すことができます

  Test t2=   new Test(){
            public void foo()
            {
              doSomething();


            }
            public void doSomething(){
                  System.out.println("Do Something");
            }

        };

つまり、明示的に foo() 内で doSomething() を呼び出し、foo() は外部からアクセス可能です。

t2.foo();

注: クラスの名前を正しく書いてください。クラスの最初の文字は大文字にする必要があります。

public class Test{}

大量のコードを書き始めると、コードが読みやすくなるため、自分や他の人に役立ちます。

于 2014-03-05T05:03:28.217 に答える
2
Test t2=new Test();` 

Test クラスのオブジェクトを作成します。

Test t2=new Test(){ };

test のサブクラス (つまり、この場合は匿名の内部クラス) のオブジェクトを作成します。

Test t2=new Test(){ 
public void foo(){ System.out.println("foo");}
};

foo() メソッドがオブジェクト t2 から呼び出されると、foo が出力されます。

于 2014-03-05T06:51:17.187 に答える