Javaの研究ノート(8) - 匿名内部クラスとオブジェクト

コードを書きながら一般的には、このような場面に遭遇すること - いくつかの点で、私はクラスを定義する必要がありますが、一度だけ、それを使用するか、または、それらが具体的に命名されているように、クラスオブジェクトは、一度だけ使用されますあなたは多くの問題を表示することがあります。これに対処するには、Javaオブジェクトは、この矛盾を解決するために匿名内部クラスと匿名の使用を許可されています

匿名オブジェクト

クラスの使用で通常のクラスオブジェクトは、クラスが配置されてから新しいアドレスを保存するために使用されるタイプの変数を定義します。匿名クラスは、この変数をキャンセルし、アドレスがコンパイラによって処理され、新しいが出た後に、それはJVMのメモリが自動的にオフに回復されますかかります。フォローアップは、もはや作業していません。
例えば

public class Student{
    public void classBegin(){
        System.out.println("good morning teacher!");
    }
}

new Student().classBegin();

匿名は、前述のprint文として、最も一般的な方法は、パラメータとして機能するオブジェクト「おはよう先生!」という文字列がオブジェクトとして格納されているので、匿名オブジェクトであるため、未使用のオブジェクト参照は、実際にそこにあります匿名オブジェクト。

もちろん、関数の戻り値として匿名オブジェクトです。

内部クラス

内部クラスの種類:内部クラスのメンバー、静的な内部クラス、ローカル内部クラス、匿名内部クラス

内部クラスのメンバー

別のクラスではJavaはクラスで定義することができます。例えば

public class Car{
    public class Engine{
        
    }
}

例えば、上記エンジンは、クラス車にクラスを定義し、外部車クラスであり、クラスは内燃機関です。

内部クラス注:クラスを含む外部の内部クラスを、内部クラスは、プライベートメソッドを含むクラス外のすべてのプロパティとメソッド、ことがわかります。しかし、その逆はありません。

内部カテゴリを使用する方法は2つあります。

  • (間接的に)外側のクラスの内部クラスメンバーを使用してください。この方法は、一般クラスの外の方法でオブジェクトクラス内に作成し、そのオブジェクトのメソッドを呼び出しています
  • 直接使用:上記の定義によれば、)(例えば `Car.EngineのENG =新車()新しいエンジンとして使用することができます。

次の例のように

public class Car{
    public class Engine{
        public void start(){
            System.out.println("引擎启动");
        }
    }

    //间接调用
    public void start(){
        System.out.println("打火");
        new Engine().start();
    }

    public static void main(String[] args){
        new Car().start();

        //直接调用
        Car.Engine engine = new Car().new Engine();
        engine.start(); 
    }
}

外部および内部クラス名の衝突のクラスのメンバーは、クラス内で使用することができる場合外部类.this.成员变量、外側のクラスのメンバーにアクセスするために
インスタンスを

public class Car{
    public String type = "奥迪";
    public class Engine{
        public String type = "奥迪引擎";
        public void start(){
            System.out.println("引擎启动");
        }
        
        public void carType(){
            System.out.println(Car.this.type);
        }
    }

    //间接调用
    public void start(){
        System.out.println("打火");
        new Engine().start();
    }

    public static void main(String[] args){
        Car car = new Car();
        //直接调用
        Car.Engine engine = new Car().new Engine();
        engine.start();
        engine.carType();
        
    }
}

部分的な内部クラス

メンバーとして定義された内部クラスだけではなく、直接外部クラスベース、また方法で定義することができ、部分的な内部クラス内部

ローカルインナークラスは、また、内部クラスのメンバーとローカルインナークラスに似埋め込みクラス領域として知られているが、クラスは、内部クラスのプロセスに埋め込まれた領域が定義されています

主な固有のものです:

  • 部分的な内部クラスのみ対応するメソッドにアクセスすることができ、この方法は、外に有効ではありません
  • あなたはプライベート、保護、公共修飾子を使用することはできません。
  • あなたは、静的メンバを含めることはできません
  • ローカル内部クラスは、ローカル変数のアクセス方法をしたい場合は、ローカル変数は定数でなければなりません。ローカル変数クラスはヒープの内部に局所的に割り当てられているスタック内の分布は、そのような状況では、外部のクラスにわたって実行する方法であってもよいので、メモリは、それがアクセスように、依然として、部分的内部クラスを回収することができますローカル変数のコピーを作成するために、ローカル変数は、クラス内に位置する部分のスタックにコピーされたとき。データの整合性を確保するために、変数が変更を許可していませんここにコピーされます。
public class carShow(){
    public void showCar(){
        final float price = 10000000f;
        final String type = "奔驰";

        class Car(){
            public void show(){
                System.out.println("这个车是" + type + ",售价:" + price);
            }
        }
    }
}

静的な内部クラス

あなたは、静的な内部クラスの宣言を使用している場合は、この内部クラスは、静的な内部クラスと呼ばれています。それはによって行うことができる外部类 . 内部类アクセスの方法。静的な内部クラスがオブジェクトに関連していないので、静的クラスのメンバを使用している場合、オブジェクトを作成する必要はありません。あなたは、静的な内部クラスは、クラスの外のメンバ変数にアクセスしたいのであれば、あなたは外部クラスのオブジェクトインスタンスを介してアクセスする必要があります。

public class Company {
    String companyNam;
    static String country;
    static class Clear{
        String name;
        public Clear() {
        }
        
        public Clear(String name) {
            super();
            this.name = name;
        }

        public void work(String name){
            String na = new Company().companyNam="联想";
            country="中国";
            System.out.println(name+"为"+na+"打扫卫生,该公司属于"+country);
        }
    }
}

匿名内部クラス

内部クラスは、操作全体で一度だけ使用した場合、その後、それは匿名内部クラスとして定義することができます。匿名内部クラスは、時にはいくつかの内部だけでそれができるオブジェクトのクラスを作成する必要があるため、私たちのJavaプログラミングとデザインの利便性のためのメカニズムでは内部クラス名、ではありませんが、このクラスの後に再び使用されることはありません、匿名内部クラスを使用して、この時間は、より適切です。

匿名内部クラスは、一般的にそのようなインタフェースを伴います

public interface USB{
    public abstract void open();
    public abstract void close();
}

public class Demo{
    public static void main(String[] args){
        USB usb = new USB(){
            public void open(){}
            public void close(){}
        }

        usb.open();
        usb.close();

        //使用匿名内部类的匿名对象的方式
        USB usb = new USB(){
            public void open(){}
            public void close(){}
        }.open();
    }
}

ローカル内部クラスで、このクラスのmainメソッドで作成されたデモでは、この内部クラスに名前がない、匿名の内部クラスを作成することです。


おすすめ

転載: www.cnblogs.com/lanuage/p/10994885.html