道路Javaの学習:28内部クラス(メンバー、ローカル、匿名、静的)と継承

ここに画像を挿入説明


如果在类中再定义一个类,则将在类中再定义的那个类称为内部类。

内部クラスのA.メンバー

内部クラスのプレゼンテーションの1メンバー

クラスの内部クラスは、直接クラスのクラス内のプライベートメンバ変数にそれを得ることができます。
次のように内部クラスの構文のメンバーは次のとおりです。

public class OuterClass{  // 外部类
    private class lnnerClass{  // 内部类
    // .......
    }
}

在内部类中可以随意使用外部类的成员方法以及成员变量。尽管这些类成员被修饰为private。

内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就好绑定在外部类对象上。内部类初始化方法与其他类初始化方法相同,都是使用new关键字。

public class OuterClass {
    innerClass in = new innerClass();  // 在外部类实例化内部类对象引用
    public void ouf() {
        in.inf();  // 在外部类方法中调用内部类方法
    }
    class innerClass {
        innerClass(){  // 内部类构造方法
    }
    public void inf() { // 内部类成员方法
    }
    int y = 0;   //定义内部类成员变量
    }
    public innerClass doit() { // 外部类方法,返回值为内部类引用
        //y = 4;    // 外部类不可以直接访问内部类成员变量
        in.y = 4; 
        return new innerClass(); // 返回内部类的引用
    }
    public static void main(String[] args) {
        OuterClass out = new OuterClass(); 
        // 内部类的对象实例化操作必须在外部类或外部类的非静态方法中实现
        OuterClass.innerClass in = out.doit(); 
        OuterClass.innerClass in2 = out.new innerClass(); 
        // 实例化一个内部类对象
    }
}

在实例化内部类对象时,不能在new操作符之前使用外部类名称实例化内部类对象,而是应该使用外部类的对象来创建其内部类的对象。

内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。


2.内部インターフェイスクラスアップキャスト

許可ベースのプライベート内部改質剤がアップキャスト親クラス・オブジェクトである、またはある場合には、プログラム内の直接上方遷移インターフェースは完全に特定の実装クラス内に隠すことができます。外部インタフェース、インタフェースで宣言された方法を提供することができます。インターフェースメソッドを実装インターフェイスは、別の方法で同じインターフェイスメソッド内部クラスが実装を複数定義することができ、同じ一般的クラス内の複数のインターフェースを実現する方法ではないことをクラス内に実装した場合。この技術は、多くの場合、Swingのプログラミングで使用されている、あなたは、クラスに応じて異なるイベントの数を作ることができます。

interface OutInterface{ // 定义一个接口
    public void fun(); 
}
public class InterfaceInner {
    public static void main(String[] args) {
        OuterClass2 out = new OuterClass2(); // 实例化一个OuterClass22对象
        // 调用doit()方法,返回一个OutInterface接口
        OutInterface outinter = out.doit(); 
        outinter.fun(); // 调用fun()方法
    }
}
class OuterClass2{
 // 定义一个内部类实现OutInterface接口
    private class InnerClass implements OutInterface{
        InnerClass(String s){ // 内部类构造方法
            System.out.println(s); 
        }
        public void fun() { // 实现接口中的fun()方法
            System.out.println("访问内部类中的fun()方法"); 
        }
    }
    public OutInterface doit() { // 定义一个方法,返回值类型为OutInterface接口
        return new InnerClass("访问内部类构造方法"); 
    }
}

実行結果:
ここに画像を挿入説明
OuterClass2クラスは、クラスはメソッドがOutInterfaceインターフェイスを返すように、その後、実装インタフェースOutInterfaceは、のdoIt()メソッドを変更することをプライベートな内部クラスの内部許可が変更されて定義されています。プライベート内部クラスInnerClass変更権ので、インナークラスのOuterClass2クラス缶アクセス外側に加えて、他のクラスは、アクセス、およびのdoItへのアクセス()メソッドができます。この方法は、外部インタフェースのタイプを返すので、このインタフェースは、外部使用のためのインターフェースとして機能することができます。クラスは、内部の権威への外部クラスではなく、ダウンキャストインナークラスInnerClassを継承するだけでなく、(楽しみにアクセスすることができない場合、それは楽しい()メソッドは、このメソッドを実装このインタフェースの継承、内部クラスを含み、 )メソッドが、それは楽しいインターフェース()メソッドにアクセスすることができます。それは、クラス、サブクラスの皮を継承しているので、実装の詳細は、単にインターフェースと外部クラスを残す人々のサブクラスを作成し、だけでなく、楽しい()メソッドを呼び出すことができますが、特定の実装プロセスの楽しさは、()メソッドは、持っていますこれはよく隠されているが、これは内部クラスの最も基本的な使用です。

非内部类不能被声明为private或protected访问类型。


3.このクラスclassキーワード内外の参照を取得します

メンバ変数のメンバ変数は、外部のクラスと同じ名前の内部クラスで定義されている場合は、このキーワードを使用することができます。

public class TheSameName{
    private int x; 
    private class Inner{
        private int x = 9; 
        public void doit(int x) {
            x++;  // 调用的是形参x
            this.x++; //调用内部类的变量x
            TheSameName.this.x++; //调用外部类的变量x
        }
    }
}

在类中,如果遇到内部类与外部类的成员变量重名的情况,可以使用this关键字进行处理。


II。部分的な内部クラス

内部クラスにクラスで定義することができ、位置がローカルクラスで定義することができるだけでなく、内部クラスのクラスメソッド、または任意の範囲として定義することができます。

interface OutInterface2{// 定义一个接口
}
class OuterClass3{
    public OutInterface2 doit(final String x){
    	// 在doit()方法中定义一个内部类
    	    class InnerClass2 implements OutInterface2{
    	        InnerClass2(String s){
    	            s = x; 
    	            System.out.println(s);
    	        }
    	    }
    	    return new InnerClass2("doit");
    }
}

III。匿名内部クラスを

class OuterClass4{
    public OutInterface2 doit(){
        return new OutInterface2(){// 声明匿名内部类
            private int i = 0; 
            public int getValue(){
                return i; 
            }
        };
    }
}

在匿名内部类定义结束后,需要加分号标识,这个分号并不是代表定义内部类结束的标识,而是代表创建OutInterface2引用表达式的标识。
匿名内部类编译以后,会产生以“外部类$序号”为名称的.class文件,序号以1~n排列,分别代表1~n个匿名内部类。


IV。静的な内部クラス

修飾子staticな内部クラスを追加する前に、この内部クラスは、静的な内部クラスになります。静的な内部クラスは、静的メンバを宣言することができますが、非静的内部クラスの静的メンバを宣言することはできません。静的内部クラスは、最大の特徴は、クラスの外で使用することができない非静的メンバである持っています。

public class StaticinnerClass{
    static class Inner{
    // .........
    }
}

継承V.内部クラス

内部クラスと他の一般的なカテゴリには、のように継承することができますが、継承された内部のアナロジーは完全に特別な構文を設定するには、複雑な、必要性の一般的なクラスを継承します。

public class OutputInnerClass extends ClassA.ClassB{
    public OutputInnerClass(Class a){
        a.super();
    }
}
class CLassA{
    class ClassB{
    }
}

在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继续内部类的外部类的引用,同时在构造方法体中使用a.super()语句,这样才能为继承提供必要的对象引用。


間違っている場合は、正しい私の批判を喜ば、コメントを歓迎します。
それぞれのテキスト文:この世界では誰かが本当にあなたが望む人生を生きるのでご安心ください。また、議会は、あなたが経験していない我慢挫折していたことを理解してください。

公開された74元の記事 ウォンの賞賛180 ・は 30000 +を見て

おすすめ

転載: blog.csdn.net/Fdog_/article/details/104747386