抽象クラスのインスタンスを作成できる理由


最近になりましてjavaの勉強を始めました。 下記のように抽象クラスでもインスタンスを作成できることを 知ったのですが、ここでわからないことがあります。

[code]

    abstract class mylog{
        public void logout(int i){
            String messageText = "log-" + String.valueOf(i);
            Log.v("my-app",messageText);
        }
    }
    
    public class hoge{
        mylog mylogclass = new mylog(){};
    }
    
[/code]

  1. 調べてみましたところこれは抽象クラスのmylogのインスタンスを 作成しているのではなく、自動でこれを継承したクラスが作成される との記述をどこかの掲示板で見たのですが、この認識で良いのでしょうか？

  2. 抽象クラスのインスタンスを作成できるということに違和感を覚えます。 このようなことが出来ることによって、どのようなメリットがあるので しょうか。

どなたかお分かりになる方、教えていただけますようお願いします。




>
> １）調べてみましたところこれは抽象クラスのmylogのインスタンスを作成しているのではなく、自動でこれを継承したクラスが作成されるとの記述をどこかの掲示板で見たのですが、この認識で良いのでしょうか？

その認識で大丈夫です。

> ２）抽象クラスのインスタンスを作成できるということに違和感を覚えます。このようなことが出来ることによって、どのようなメリットがあるのでしょうか。

下のコードような書き方でメソッドをオーバーライドしたり、また、実装したりできるので、いちいちサブクラスを書くよりも短く記述できるのケースがあることが、メリットとしてあるかと思います。

[code]

    public class hoge{
        mylog mylogclass = new mylog(){
            @Override
            public void logout(int i){
                String messageText = "log-overrided-" + String.valueOf(i);
                Log.v("my-app-overrided", messageText);
            }
        };
    }
    
[/code]




> 抽象クラスのインスタンスを作成できる～ことによって、どのようなメリットがあるのでしょうか。

ここだけ補足します。

暗黙的に外側のインスタンスを握るので、外側インスタンスのフィールドやメソッドにアクセスできます。なので、注意しないとActivityインスタンスを握ってしまい、メモリリークの原因になるので注意。

[code]

    public class MyActivity extends Activity {
        private String mToken; // アクセストークン。これはMyActiviyのフィールド
        void myMethod() {
            mylog mylogclass = new mylog(){
                @Override
                public void logout(int i){
                    // mTokenはアクセス可能
                    String messageText = mToken + "log-overrided-" + String.valueOf(i);
                    Log.v("my-app-overrided", messageText);
                }
            };
        }
    }
    
[/code]

