内部クラス
クラス内に記述されたクラスは内部クラスと呼ばれ、内部クラスには通常、メンバー内部クラス、ローカル内部クラス、匿名内部クラス、および静的内部クラスの 4 つのタイプが含まれます。
アドバンテージ:
1. インタフェースは独立して継承できるため、多重継承のソリューションが完成します
2. 一定の論理関係を持つクラスはまとめて編成され、外界から隠すことができます
3. スレッドコードやイベントドライバを書くのに便利
メンバー内部クラス
クラス内およびメソッド外に記述されたクラスはメンバー内部クラスです。
class Circle {
double radius = 0;
public Circle(double radius) {
this.radius = radius;
}
class Draw { //内部类
public void drawSahpe() {
System.out.println("drawshape");
}
}
}
特徴:
外部クラス (プライベート メンバーと静的メンバーを含む) のすべてのメンバー プロパティとメンバー メソッドに無条件にアクセスします。
メンバー内部クラスに外部クラスと同名のメンバー変数やメソッドがある場合、デフォルトではメンバー内部クラスのメンバーがアクセスされるという隠れた現象が発生しますが、同じ名前にアクセスしたい場合は外部クラスのメンバーには、次の形式でアクセスする必要があります。
外部类.this.成员变量
外部クラスがメンバー内部クラスのメンバーにアクセスする場合、最初にメンバー内部クラスのオブジェクトを作成し、次にこのオブジェクトを指す参照を介してアクセスする必要があります
class Circle {
private double radius = 0;
public Circle(double radius) {
this.radius = radius;
getDrawInstance().drawSahpe(); //必须先创建成员内部类的对象,再进行访问
}
private Draw getDrawInstance() {
return new Draw();
}
class Draw { //内部类
public void drawSahpe() {
System.out.println(radius); //外部类的private成员
}
}
}
public class Test {
public static void main(String[] args) {
//第一种方式:
Outter outter = new Outter();
Outter.Inner inner = outter.new Inner(); //必须通过Outter对象来创建
//第二种方式:
Outter.Inner inner1 = outter.getInnerInstance();
}
}
class Outter {
private Inner inner = null;
public Outter() {
}
public Inner getInnerInstance() {
if(inner == null)
inner = new Inner();
return inner;
}
class Inner {
public Inner() {
}
}
}
ローカル内部クラス
ローカル内部クラスは、メソッドまたはスコープで定義されたクラスです. メンバー内部クラスとの違いは、ローカル内部クラスのアクセスがメソッドまたはスコープに制限されていることです.
ローカル内部クラスは、メソッド内のローカル変数のようなもので、public、protected、private、および static 修飾子を持つことはできません
class People{
public People() {
}
}
class Man{
public Man(){
}
public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
}
匿名の内部クラス
匿名の内部クラスは new の背後にあり、インターフェイスの実装やクラスの継承に使用できますが、名前を持つことができないため、参照する方法はありません。
形式: 新しいクラス {メソッド本体}
静的内部クラス
クラスの宣言時に static キーワードを追加すると、外部クラスのプロパティおよびメソッドと並列関係になります。
静的内部クラスは、静的として変更された内部クラスです。static として宣言された内部クラスは、内部クラス オブジェクトと外部クラス オブジェクト間の接続を必要としない、つまり、ユーザーは「外部クラス.内部クラス」を直接参照できます。
オーバーロードと書き換え
過負荷
オーバーロード: クラスには同じ名前のメソッドが複数存在する可能性がありますが、これらのメソッドのパラメーターは異なる必要があります
メソッドの戻り値の型とパラメーター名は比較されません。つまり、比較するときは、パラメーターの型、数、および相対位置にのみ注意を払い、戻り値の型は、メソッドのオーバーロードかどうかの判断とは関係ありません。
特徴:
オーバーロード オーバーロードは、クラスのポリモーフィズムの現れです。
オーバーロードには、同じ名前のメソッドに対して異なるパラメーター リストが必要です (パラメーターの型、パラメーターの数、さらにはパラメーターの順序)。
オーバーロードする場合、戻り値の型は同じでも異なっていてもかまいません。オーバーロードされた関数を区別する基準として戻り値の型を使用することはできません。
リライト
サブクラスにメソッドが定義されており、このメソッドの型(戻り値の型)が親クラスのメソッドの型(戻り値の型)と同じか、親クラスのメソッド型のサブタイプであることを意味します、およびこのメソッドの名前とパラメーター番号とパラメーターの型は、親クラスのものとまったく同じです。
特徴:
親クラスと子クラスの間で発生します。
メソッド名、パラメーター リスト、および戻り値の型 (サブクラスのメソッドの戻り値の型が親クラスの戻り値の型のサブクラスであることを除く) は同じでなければなりません。
アクセス修飾子の制限は、オーバーライドされたメソッドのアクセス修飾子よりも大きくする必要があります。
オーバーライドされたメソッドは、新しいチェック例外またはオーバーライドされたメソッド宣言よりも広いチェック例外をスローしてはなりません
違い
1. メソッドのオーバーロードと書き換えはどちらもポリモーフィズムを実現する方法ですが、違いは、前者はコンパイル時のポリモーフィズムを実装し、後者は実行時のポリモーフィズムを実装することです。
2. クラス内でオーバーロードが発生する. 同じ名前のメソッドのパラメーター リストが異なる (パラメーターの型が異なる、パラメーターの数が異なる、またはその両方である) 場合、オーバーロードと見なされ、サブクラスと親クラスの間で書き換えが発生します。その間に、書き換えには、サブクラスのオーバーライドされたメソッドが、親クラスのオーバーライドされたメソッドと同じパラメーター リストを持ち、互換性のある戻り値の型を持ち、親クラスのオーバーライドされたメソッドよりも優れたアクセス権を持ち、宣言されたメソッドよりも多く宣言できないことが必要です。親クラスのオーバーライドされたメソッド より多くの例外 (リスコフ置換原理)。
3. オーバーロードには、戻り値の型に関する特別な要件はなく、戻り値の型に従って区別することはできません。
注釈
注釈は一種のメタデータであり、コメントや説明として理解できます. コードに情報を追加するための正式な方法を提供し、コードをより迅速に記述するために使用されます.
一般的に使用される注釈は、次の 3 つのカテゴリに分類できます。
1. Java に付属する標準アノテーション
2. メタ アノテーションは、既存のアノテーションを説明するアノテーションです。
3.カスタム注釈、ユーザーは自分のニーズに応じて注釈を定義できます
一般的に使用される Java アノテーション:
1. @Deprecated – マークされたコンテンツは使用が推奨されなくなりました。
2. @Override – メソッドのみをマークでき、メソッドが親クラスのメソッドをオーバーライドすることを示します。
3. @Documented -- マークされたコンテンツを javadoc に表示できます。
4. @Inherited – 「注釈タイプ」をマークするためにのみ使用でき、それによってマークされた注釈には継承があります。
5. @Retention – 「注釈タイプ」をマークするためにのみ使用でき、注釈の RetentionPolicy 属性を指定するために使用されます。
6. @Target – 「注釈タイプ」をマークするためにのみ使用でき、注釈の ElementType プロパティを指定するために使用されます。
7. @SuppressWarnings – マークされたコンテンツによって生成される警告。コンパイラはこれらの警告を無視します。
8. @interface – 注釈を定義するために使用されます。
メタ アノテーション:
@Retention、アノテーションに適用すると、アノテーションの有効期間が説明されます
@Documented、その機能は、アノテーションの要素をJavadocに含めることができることです
@Target は、アノテーションが使用される場所を指定し、このアノテーションは使用シナリオに限定されます
@継承、継承
@繰り返し可能、繰り返し可能
反射
定義: リフレクションは実行中の状態です. どのクラスでも, このクラスのすべてのプロパティとメソッドを知ることができます (プライベートかパブリックかに関係なく). オブジェクトを動的に呼び出す動作はリフレクション メカニズムと呼ばれます.
特徴:
-
実行中の状態では、どのクラスもすべてのプロパティとメソッドを知ることができます
-
どのオブジェクトでも、そのメソッドとプロパティを呼び出すことができます
なぜそれを使用するのですか?
-
クラスまたはメンバー変数またはメソッドの属性がシステム用にのみ開発されている場合、それらはリフレクションによって取得できます。
-
実行時に任意のオブジェクトのクラスを決定し、任意のクラスのオブジェクトを構築し、任意のオブジェクトのメソッドを呼び出します
-
既知の名前クラスの内部情報を取得できます
達成:
1.オブジェクト名.getClass()で取得
Student s = new Student();
Class c = s.getClass();
2. クラス名.classで取得
Class c = Student.class;
3. Class.forName("完全なパッケージ名 + クラス名") を取得する
Class c = Class.forName("com.gzxkb.Student");
4.クラスを取得する
asSubclass(Class<U> clazz) 把传递的类的对象转换成代表其子类的对象 Cast 把对象转换成代表类或是接口的对象
getClassLoader() 获得类的加载器
getClasses() 返回一个数组,数组中包含该类中所有公共类和接口类的对象 getDeclaredClasses() 返回一个数组,数组中包含该类中所有类和接口类的对象 forName(String className) 根据类名返回类的对象
getName() 获得类的完整路径名字
newInstance() 创建类的实例
getPackage() 获得类的包
getSimpleName() 获得类的名字
getSuperclass() 获得当前类继承的父类的名字
getInterfaces() 获得当前类实现的类或是接口
getAnnotation(Class<T> annotationClass) 获取类上面的注解 isAnnotationPresent(Class<T> annotationClass) 判断是否对应的注解
5. クラス関連の属性を取得する
getField(String name) 获得某个公有的属性对象
getFields() 获得所有公有的属性对象
getDeclaredField(String name) 获得某个属性对象
getDeclaredFields() 获得所有属性对象
6. コンストラクターを取得する
1、无参构造函数(必须存在无参构造函数)newInstance();
Object o = Class.forName("com.gzxkb.Student").newInstance();
2、getConstructor(Class...<?> parameterTypes) 获得该类中与参数类型匹配的公有构造方法
3、getDeclaredConstructors() 获得该类所有构造方法
7. 手順
対象の型の Class オブジェクトを取得する
Class オブジェクトを介して、Constructor クラス オブジェクト、Method クラス オブジェクト、または Field クラス オブジェクトをそれぞれ取得します。
Constructorクラスのオブジェクト、Methodクラスのオブジェクト、Fieldクラスのオブジェクトを通じて、クラスのコンストラクタ、メソッド、属性の固有情報を取得し、その後の操作を実行する