道は邪魔で長く、線が来ています。頭を下げて一生懸命頑張ってください。話さなければ、あなたは大ヒット作になります!さあ、サンニアン!
ディレクトリとリソースのインデックス
Java4Android自己学習プロセスのカタログとリソースインデックス
1内部クラスとは何ですか?
内部クラス:クラスは別のクラスの内部で定義されるため、このクラスは内部クラスと呼ばれ、コード例は次のとおりです。
class A
{
class B
{
}
}
この時点で直接コンパイルすると、コンパイルの結果はどうなりますか?以下に示すように、コンパイル後に2つのクラスファイルがあります。
このうち、A $ B.classは内部クラスによって生成されたクラスファイルです。
内部クラスのコンパイルされた名前は次のとおりです。外部クラス名$内部クラス名。クラス。
2内部クラスの文法的特徴は何ですか?
2.1内部クラスオブジェクトを生成する方法
上記のクラスファイルを引き続き使用します。この時点で、メイン関数を格納する新しいクラスを作成します。プログラムの内容は次のとおりです。
class Test
{
public static void main(String args[])
{
A a = new A(); // 生成类A 对象
A.B b = new A().new B(); // 生成子类B 对象
}
}
2.2内部クラスメンバー変数/関数の使用方法
まず、最初のセクションでクラスファイルを変更し、テストのためにいくつかのメンバー変数を追加します。具体的なコードは次のとおりです。
class A
{
int i;
class B
{
int j;
int funB()
{
int result = i + j;
System.out.println(result); // 添加result打印,调试用
return result;
}
}
}
この時点で、メイン関数を変更し、クラスAとクラスBのメンバー変数に値を割り当て、関数の出力結果を表示します
class Test
{
public static void main(String args[])
{
A a = new A(); // 生成类A 对象
A.B b = a.new B(); // 生成子类B 对象
a.i = 3;
b.j = 1;
b.funB();
}
}
上記のコードをコンパイルして実行すると、結果は次のようになります。
コードの分析と実行結果から:
- 内部クラスは、外部クラスによって定義されたメンバー変数を自由に使用できます。
- BはAの内部クラスです。つまり、Aのメンバー変数とメンバー関数を自由にBで使用できますが、これは、BがAを継承して使用できることを意味しませんが、Bはこれらのメンバー変数を所有しません。
- 内部クラスのすべてのオブジェクトは、外部クラスのオブジェクトに関連付けられています。つまり、内部クラスオブジェクトがある場合、それに関連付けられている外部クラスオブジェクトが必要です。
- 内部クラスBで実際に使用される変数iは、外部クラスのメンバー変数です。
3匿名の内部クラス
匿名内部クラス:最初は内部クラスであり、名前はありません。匿名内部クラスと呼ばれます。
以下の特定のコードを使用して、新しいインターフェイスクラスAを実装および作成します
interface A
{
public void doSomething();
}
次に、クラスBを定義します。
class B
{
public void fun(A a)
{
System.out.println("B类的fun函数");
a.doSomething();
}
}
現時点では、クラスBにはタイプAのオブジェクトが必要です。次のように、Aはオブジェクトを直接生成できないため、パラメーターとして、インターフェイスAのサブクラスも必要です。
class AImpl implements A
{
public void doSomething()
{
System.out.println("doSomething");
}
}
この時点でmain関数は少し変更されています。具体的なコードは次のとおりです。
class Test
{
public static void main(String args[])
{
AImpl al = new AImpl(); // 生成子类对象
A a = al; // 向上转型
B b = new B();
b.fun(a); // 传进去类型为A的参数
}
}
上記のコードのコンパイルと実行の結果は次のとおりです。
現時点で匿名の内部クラスが使用されている場合は、通常とは異なる方法で記述されることに注意してください。メイン関数コードを次のように変更します。
class Test
{
public static void main(String args[])
{
// AImpl al = new AImpl(); // 生成子类对象
// A a = al; // 向上转型
B b = new B();
b.fun(new A()
{
public void doSomething()
{
System.out.println("匿名内部类");
}
}
);
}
}
上記のコードを再コンパイルすると、実行結果は次のようになります。
匿名の内部クラスコードとコンパイル結果の分析は次のとおりです。
- クラスBのfun関数にはタイプAのオブジェクトが必要です。これは基本的に前のAImplに似ていますが、名前はありません。
- new A()は直接使用できません。インターフェイスを実装するクラスの後に続く必要がありますが、名前がないと匿名クラスと呼ばれます。
4まとめ
- 内部クラス、内部クラスの基本的な文法特性、実装方法などを理解します。
- 内部クラスのメンバー変数とメンバー関数の使用法とスコープを理解します。
- 匿名の内部クラス、特性、および実装方法の簡単な理解。
記事の内容が間違っている場合は、コメント/プライベートメッセージをたくさんアドバイスしてください、ありがとう!記事の内容が悪くないと思うなら、いいねを残してください。あなたのいいねが私の最大の励ましです、ありがとう!