4つの内部クラスの分析
まず、Javaクラスの主要コンポーネントを理解する必要があります。
クラスのメンバー:
1.属性
普通属性
静态属性
2.方法
普通方法
静态方法
3.コンストラクター
4.コードブロック
普通代码块
静态代码块
5.内部カテゴリ:
在一个类的内部在写一个类-内部类
(1).普通成员内部类 普通属性
(2).静态成员内部类 静态属性 查看源码
(3).局部内部类 局部变量
(4).匿名内部类 匿名对象 参照
内部クラスの役割:
1。外部クラスの機能は拡張可能であり、外部からアクセスすることはできません
。2。多重継承の間接的な実現。内部クラスと外部クラスの両方が1つのクラスを継承します。
(1)通常のメンバーの内部クラス:
通常のメンバーの内部クラス:
1。外部クラスはパブリックデフォルトでのみ変更できます
2.内部クラスは4つのアクセス許可修飾子で変更できます
3.内部クラスは静的属性を持つことはできませんが静的定数は存在できます
4.内部クラスはできません静的メソッド
5があります。外部クラスのリソース属性は内部クラスで直接使用できます。静的メソッドと非静的メソッドの両方を使用できます。6
。内部クラスのリソースは外部で使用できます。
内部クラスオブジェクトは次のことができます。非静的リソースが静的リソースの
内部クラス名にアクセスするために作成されます。属性名
7.外部クラスの静的メソッドで内部クラスオブジェクトを直接作成することはできません。
8.内部クラスオブジェクトを
外部で直接作成する方法外部クラス名。内部クラス名変数名=外部クラスオブジェクト。新しい内部クラスobject();
Person.Inner inner = new Person()。new Inner();
9.内部クラスのコンパイル後に生成されるバイトコードファイルの命名規則
外部クラス名内部クラス名Person内部クラス名Personユニットクラス名P E R&LT S O N-インナー
内部は、クラスファイルを生成し、独立したバイトコード
(2)静的メンバーの内部クラス:
静的メンバー内部クラス:
1。宣言メソッドで、外部クラスに静的クラスクラス名{ }を記述します。2 。内部クラスに静的属性を含めることができます。3 。外部クラス の非静的リソースを含めることはできません。内部クラスで直接使用されます。外部クラスオブジェクトを作成する必要があります。4を使用するには、外部クラスの静的メソッド内に内部クラスオブジェクトを作成できます。内部リソースクラスオブジェクトを介して中央アフリカの静的内部クラスを呼び出すことができます。クラス静的リソース内の内部クラス名を呼び出すには5.クラス名の外部の外部クラスに直接内部クラスオブジェクトを作成します。内部クラス名変数名=新しい外部クラス名。内部クラス名();変数名:内部クラスobject Outer.Inner inner = new Outer.Inner(); 6.内部クラスは独立したバイトコードファイルの命名を生成しますメソッド外部クラス名$内部クラス名7.外部クラスオブジェクトを直接作成すると、静的内部クラスの初期化がトリガーされますか?内部クラスのリソースが使用されていない場合、内部クラスの初期認識は実行されません。内部クラスのリソースのみが使用されている場合、外部クラスの初期化はトリガーされません。
(3)。ローカル内部クラス:
ローカル内部クラス:ローカル変数を参照
1.ローカル内部クラスを宣言する
方法メソッドで新しいクラスを作成する
2.ローカル内部クラスのステータスが比較的低い。使用される外部クラスのリソースはメソッドによって異なります。
静的メソッドは外部クラスの静的リソースを使用できます。
非静的メソッドは外部クラス
3のすべてのリソースを使用できます。ローカル内部クラスは静的プロパティを持つことはできませんが、静的定数を持つことができます。
4.内部クラスのリソースを使用するには、外部クラスのメソッドを実行し
て、内部クラスオブジェクトを介して内部クラスのオブジェクトを作成する必要があります。関連リソース
5.ローカル内部クラスも独立したバイトコードファイルを生成します。バイトコードファイルの命名方法は
外部クラス名$シリアル番号内部クラス名シリアル番号は1から始まります
Outer $ 1Inner
Outer $ 2Inner
6.ローカル内部クラスのメソッドが外部クラスのローカル変数を使用する場合、ローカル変数はfinalによって自動的に変更され
ますjdk1.8自動的に追加されますfinal
(4)匿名の内部クラス:
匿名の内部クラス:
名前のない内部クラス
機能:
コードの保存
匿名の内部クラスを作成する方法:
new 类(){
}
new 接口(){
}
1.创建了一个没有名字的匿名子类
2.创建了该匿名子类对象
注:
1。匿名内部クラスは名前のないローカル内部クラスです
。2 。匿名内部クラスが使用できるリソースは、メソッドが静的かどうかによって異なります。
静的メソッドは静的リソースのみを使用できます。
非静的メソッドは次のことができます。すべてのリソースを使用します。3 。匿名内部クラスは
メソッドのローカル変数を使用します。この変数は最終的に変更されます
。4。匿名内部クラスは別のバイトコードファイルも生成します。
名前付けメソッド外部クラス名$シリアル番号
Test2 $ 1.class
Test2 $ 2。クラス
Test2 $ 3.class
例:
public class Test2 {
static String name = "Test2";
int age =10;
public static void main(String[] args) {
int num = 10;
//创建了一个Person的匿名子类 并且完成了该匿名子类对象的创建
new Person() {
}.eat();
new Person("李白", 20) {
}.eat();
new Animal() {
@Override
void eat() {
System.out.println(name);
System.out.println("小猫吃饭");
System.out.println(num);
}
}.eat();
new Fly() {
@Override
public void fly() {
System.out.println("超人飞");
}
}.fly();
}
}
interface Fly {
void fly();
}
abstract class Animal {
abstract void eat();
}
class Person {
String name;
int age;
public void eat() {
System.out.println(name + "Person eat");
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}