オブジェクトクラス、内部クラス、クラス、およびJavaのクラス間の関係

Objectクラスは、Javaのルートクラス(祖先クラス)です。

  • すべてのクラスはObjectクラスを継承し、空のクラスも継承します。
  • したがって、Objectのメソッドは、すべてのクラスが持つことができる関数です。
  • Object xxx = new xxx();オブジェクトはポリモーフィックにすることができます。
  • ポリモーフィズムが発生する可能性があるため、メソッドがデータを渡す必要がある場合、データ型がわからないときにObjectを書き込むことができます。
  • 方法を学ぶ方法は?
  •  1.该方法是谁的?
    
  •  2.是什么方法?(成员还是静态)
    
  •  3.方法的功能是什么?入参出参是什么?能实现什么,我们需要给它什么,它能给我们提供什么;
    
  •  4.方法的覆写,什么情况下覆写?
    
  • equalsの設計目的は、2つのオブジェクトが等しいかどうかを比較することです。
  • ただし、この関数は実装されていません。必要に応じて上書きする必要があります。
  • 2つのオブジェクトは何でもかまいません。インスタンスに固有の場合にのみ、上書きすることでこのメソッドを実現できます。
  • @author MARECLE_YING
  • @date 2021年1月18日
    * /
    パブリッククラス_02Equals { //メインメソッドのパブリック静的無効メイン(文字列[] args){ //オブジェクトを作成S1、S2、パラメータ化された構成および割り当てを介してそれらの//割り当て値学生S1 = new Student(18、 "李阳"); Student s2 = new Student(19、 "李阳"); //出力比較==比較はメモリアドレスfalseSystem.out.println (s1 == s2); // equals 2つのオブジェクトを比較しますSystem.out.println(s1.equals(s2)); } } //学生クラスクラスを作成しますStudent { // getter / setterメソッドを使用するため、メンバー変数privateをプライベート化する必要がありますint age; private String name; // getter / setterメソッドを使用しますpublicint getAge(){ return age; } public void setAge(int age){






















    this.age = age;
    }
    public String getName(){ return name; } public void setName(String name){ this.name = name; } //パラメトリック構造を作成しますpublicStudent (int age、String name){ super( ); this.age = age; this.name = name; } //引数以外の構造を作成しますpublicStudent (){ super(); // TODO自動生成されたコンストラクタスタブ} // equalsメソッドを要件//要件同じ名前は学生です@Overridepublic boolean equals(Object arg0){ // 1.アドレスを比較します;等しいアドレスはそれらが同じオブジェクトであり、値が等しくなければならないことを示しますif(this == arg0 ){ return true; }
























    // 2.オブジェクトの型が現在のクラス型であるかどうかを判断します。そうでない場合はfalseを返し、異なるクラスは比較
    できません。if(arg0 instanceof Student){ // 3.型変換を強制し、目的のデータを比較しますStudent s2 =( Student)arg0; //値が等しいかどうかを判断します//if(name.equals(s2.name)&& age == s2.age){ if(name.equals(s2.name)){ return true; } }はfalseを返します; }









}

等しい

  • 設計目的:2つのオブジェクトが等しいかどうかを比較します。
  • ==および!=:基本的なデータ型を比較し、値のサイズを比較します。
  •  					比较引用数据类型,比较内存地址;
    
  • equalsはデフォルトでメモリアドレスを比較します。
  •  		   实际中我们常常比较的都是对象的有意义的属性;
    
  • 文字列が等しいかどうかを比較するには、==がメモリアドレスを比較するため、equalsを使用する必要があります。
  • Stringクラスのequalsメソッドをオーバーライドし、メモリアドレスではなく値を比較します。
  • したがって、equalsを使用して、同じ種類の2つのオブジェクトのプロパティを上書きして比較することもできます。
  • 異なるタイプのオブジェクトは比較できません。
  • 実装方法:2つのアドレスが同じかどうかを比較する場合を除いて、参照型の比較は比較のために基本型に変換する必要があります。
  • オブジェクト指向は基本的なデータカプセル化の一形態であるため、比較するときは基本的な型比較に変換する必要があります。
  • @author MARECLE_YING
  • @ Date 2021年1月18日
    /
    public class _01Equals { // mainメソッドpublicstatic void main(String [] args){ // 2つのString型オブジェクトを作成しますs1s2 s3 String s1 = new String( "998"); String s2 = new String( "1088"); String s3 = new String( "1088"); //比較結果を出力します。比較はメモリアドレスであり、アドレスは異なっている必要があります; false System.out.println(s1 = = s2 ); // equalsは値のサイズを比較します//構文構造:object 1.equals(object 2)//値は異なりますfalse System.out.println(s1.equals(s2)); //値同じ、True System.out.println(s2.equals(s3)); } } package _16_Object_Finalize; /

















    *

メソッド関数のファイナライズ

  • ガベージは、コレクションの最後のステップでこのメソッドを呼び出します。これは、オブジェクトの上書きを実現するためのものです。
  • ①finalizeは、最終的にゴミになってリサイクルされるため、すべてのオブジェクトのメソッドです。
  • ②プログラムから呼び出す必要はなく、システムが自動的に呼び出す
  • ③ゴミとは?Javaでは、このオブジェクトへの参照がこれ以上ない場合、このオブジェクトには値がなく、システムはそれをガベージデータとして扱います。
  • リサイクルされるのを待って、リサイクルする前に、自動的にfinalizeメソッドを呼び出します
  • ④ファイナライズはガベージコレクションとは関係ありませんが、実際にはガベージコレクションの最後のステップで実行が設定されます。これは、この時点で自動的に実行されるメンバーメソッドに相当します。
  • ⑤一般的に、一部のオブジェクトがリサイクルされる前のデータ破壊操作に使用されます(アプリケーションシナリオ)
  • @author MARECLE_YING
  • @date 2021年1月18日
    /
    パブリッククラス_01Finalize { //メインメソッドのpublic static無効メイン(文字列[] args){ //オブジェクトのインスタンス化動物の動物を=新しい動物は();値空に動物のアドレスを設定//動物= null; //プログラマーは、ガベージコレクターがjvmをリサイクルしてガベージを収集することを推奨しています。//リサイクルすることをお勧めします。リサイクルがない場合があります。System.gc(); //ガベージが多すぎる場合は、アドバイスが必要であり、システムが自動的に再利用される999999オブジェクトを作成するためのforループを//使用をするために(I = 0のint; I <999999; I ++){ 新しいアニマル(); } } } //は動物作成クラス動物を{ / / finalizeメソッドを作成します//この場所はfinalizeメソッドを介してガベージが収集されているかどうかを示します//実際、ガベージコレクションはこのメソッドとは関係ありません。コレクションのトリガー条件はオブジェクト。さらにオブジェクトがある場合、システムは自動的にpublic void finalize(){を リサイクルします。






















    System.out.println(this + "回復したい、保存してください_ ");
    }
    } _
    16_Object_HashCodeのパッケージペナルティ;
    /
    *

ハッシュコード

設計目的:各オブジェクトの一意の識別子を生成する
*

  • ハッシュ:同じオブジェクトが複数のハッシュ値を生成し、値は同じである必要があります。
  •  				多个对象生成多个hash值时,值可能会相同,不能确保生成的hash值不同,这种情况被称作哈希冲突;
    
  • ハッシュの競合があるため、ハッシュ値はデータの一意性を保証できません。
  • データの一意性を確保するために、最初にハッシュを比較します。
  • 異なるハッシュは異なるオブジェクトを示します。
  • ハッシュは同じであり、オブジェクトが同じである可能性があることを示しているため、オブジェクトが等しい(等しい)かどうかを比較する必要があります。
  • hashCodeを上書きするときに他に何を考慮する必要がありますか?等しい
  • equalsをオーバーライドするときは、hashCodeも考慮してください。
  • したがって、Javaでは、オブジェクトの一意性はhashCodeで表され、
  • ハッシュアルゴリズム:可変長の値を固定長の値に変換する安全な暗号化アルゴリズム。欠点は、ハッシュの競合があることです。
  • @author MARECLE_YING
  • @ Date 2021年1月18日
    * /
    public class _01HashCode { // mainメソッドpublicstatic void main(String [] args){ //オブジェクトをインスタンス化する_01HashCode hc = new _01HashCode(); //メンバー変数とオブジェクトを定義するハッシュを割り当てるhcの値inthash = hc.hashCode(); //システムシステムはjavaのJVM仮想マシンです//出力ハッシュの値はhcのハッシュ値である必要があります。メモリアドレス// 10進数メモリアドレスSystem.out.println(hash); // hcのメモリアドレスを出力しますSystem.out.println(hc); //メンバー変数hashの値を出力し、16進数に変換して、System.out.println(Integerを出力します。 toHexString(hash)); } // hashCodeを上書きする//ここでの戻り値はhashCodeの値を変更できます@Overridepublic int hashCode(){ // TODO自動生成されたメソッドスタブ




















    // super.hashCode();を返します
    1999年に戻る。
    }

}

toString:

  • 設計目的:オブジェクトの文字列表現を返すために、このメソッドを介して、各オブジェクトのデータを表示できます
  • 参照型を出力するとき、オブジェクトのtoStringメソッドが自動的に呼び出されます。
  • @author MARECLE_YING
  • @ Date 2021年1月18日
    * /
    public class _01toString { public static void main(String [] args){ //オブジェクトs1をインスタンス化し、文字を割り当てますString s1 = new String( "String"); //メモリアドレスがない理由( toStringはStringクラスで上書きされます)System.out.println(s1); //オブジェクトp1をインスタンス化し、パラメーター構築を介して割り当てますPerson p1 = new Person(18、 "Li Yang"); //出力はアドレスですof p1 System.out.println(p1); //出力名:Li Yang;年齢:18 // toString System.out.println( "Name:" + p1.getName()+ "を上書きすることで、出力を最適化できます; Age: "+ p1.getAge()); } } //クラスPersonを作成します{ // getter / setterステートメントを使用して値を操作しますprivateint age; private String name; public int getAge(){ return age;





















    }
    public void setAge(int age){ this.age = age; } public String getName(){ return name; } public void setName(String name){ this.name = name; } //構築メソッドには受け取るパラメータがあります上記渡された値publicPerson (int age、String name){ super(); this.age = age; this.name = name; } // toStringをオーバーライドして出力を最適化@Overridepublic String toString(){ // TODO自動生成されたメソッドスタブ// return super.toString(); return "name:" + name + "; age:" + age; }




















}

インナークラス

  • 簡単に言えば、クラス本体に新しいクラスを作成することです。
  • ①メンバー内部クラス(非静的)
  • ②静的メンバー内部クラス
  • ③ローカルインナークラス
  • ④匿名内部クラス(正式参加実パラメータ)
  • アプリケーションシナリオ:Thingの内部部分を記述するために完全な構造が必要な場合は、内部クラスを作成できます。
  •  			  java中 允许一个类定义在一个类的内部,前者称为内部类,后者成为外部类;
    
  •  			  外部类调用内部类是,必须给出完整的名称让系统找到它;
    
  • 内部クラスの特徴:外部クラスのプライベートデータにアクセスできます。
  • 変数:
  •  成员变量:成员内部类;
    
  •  静态变量:静态内部类;
    
  •  局部变量:局部内部类;
    
  •  形参与实参变量:匿名内部类;
    

メンバー内部クラス:

  •  1.可以等同看作成员变量
    
  •  2.成员内部类中不能有静态声明
    
  •  3.成员内部类中可以直接访问外部类所有的属性
    
  • @author MARECLE_YING

  • @ Date 2021年1月18日
    * /
    public class _01_InnerClass { //プライベート化されたメンバー変数// static private static String s1 = "A"; //非静的privateString s2 = "B";




     // 创建内部类
     // private public protected 都可以使用
     // 编译后的类名为 外部类类名$内部类类名
     // _01_InnerClass$_01_InnerClass
     	public class InnerClass{
     		//内部类不能有静态声明(静态类和静态方法)
     		//static int x;
     		// public static void m1(){}
     		public void m1(){
     			// 内部类可以直接访问外部类的所有属性
     			System.out.println(s1);
     			System.out.println(s2);
     	}
     }
     // main方法
     public static void main (String[]args){
     	//创建外部类对象
     	_01_InnerClass wb = new _01_InnerClass();
     	//通过外部类去创建内部类对象
     	InnerClass nb = wb.new InnerClass();
     	nb.m1();
     }
    

}
パッケージ_18_InnerClass;
/ **

  • 静的内部クラス

  • 1.静的変数と見なすことができます
  • 2.静的内部クラスでは、メンバーデータに直接アクセスすることはできず、オブジェクトが必要です。
  • 3.任意の変数を静的内部クラスで宣言できます
  • @author MARECLE_YING
  • @ Date 2021年1月18日
    * /
    public class _02_InnerClass { //プライベート変数を作成する//静的プライベート静的文字列s1 = "私は静的メンバー変数です"; //非静的プライベート文字列s2 = "私はメンバー変数です" ; //静的内部クラスを作成しますstatic宣言静的プライベート静的クラスInnerClass { // m1静的メソッドを作成しますpublicstatic void m1(){ //静的メンバープロパティに直接アクセスできますSystem.out.println(s1); //メンバー属性に直接アクセスできません//System.out.println(s2);//オブジェクト呼び出しを使用する必要があります//型オブジェクトに関連するクラスにオブジェクトクラスを作成しますsはその値と同等です_02_InnerClasss = new _02_InnerClass (); //オブジェクトを使用して出力を呼び出すSystem.out.println(s.s2); } //メンバー属性に直接アクセスできないpublicvoid m2(){ //メソッドに関係なく、メンバー属性に直接アクセスできない静的であるかどうか。






















    // System.out.println(s2);
    System.out.println( "私はm2メンバーメソッドです");
    }
    }
    //メインメソッドを
    記述しますpublicstatic void main(String [] args){ //フルパス:externalClass。Innerclass。static_02_InnerClass.InnerClass.m1 (); //現在のクラスの静的プロパティにアクセスする場合、クラス名は省略できます(外部クラスの場合)// m1は静的メソッドInnerClass.m1( ); //はいInnerClassインスタンス化オブジェクトInnerClassx = new _02_InnerClass.InnerClass(); //同様に、現在のクラスでは、静的外部クラスを省略できますInnerClass x1 = new InnerClass(); //内部クラスオブジェクトを使用して呼び出します独自のメンバーメソッドx1.m2(); } }












クラスとクラスの関係:

  • ①継承関係/一般化関係;
  • ②実現関係;クラスとインターフェースの複数の実現;
  • ③依存関係; 1つのメソッドで別のクラスを呼び出す;
  • ④関連関係;あるクラスのメンバー変数は別のクラスのオブジェクトへの参照です。
  • ⑤アグリゲーション関係。各メンバーは一人で能力を持ち、一緒になって素晴らしいことをする組織になり、組織なしで自分で物事を行うことができます。
  • ⑥組み合わせ関係;部品が組み合わせて全体になる;部品の場合、全体から分離することは無意味です。全体が死ぬと、部品は死んでしまいます。
  • @author MARECLE_YING
  • @ Date 2021年1月18日
    * /
    public class _01ClassRelation { //関連付け関係あるクラスのメンバー変数は、別のクラスオブジェクトへの参照です; //関連付け関係は、クラス本体で発生します//タイプがメンバー変数は基本データ型ではなく、関係です。//Aはクラスですが、その値はタイプAに相対的です。その値はaです。このオブジェクトA a = new A(); public static void main( String [] args){ //依存関係1つのメソッドで別のクラスを呼び出すことは、別のクラスオブジェクトへの参照であるローカル変数同等です//依存関係はメソッド本体で発生します//メインメソッドAで別のクラスを呼び出すaa2 = new A (); } } //クラスクラスAを作成する{














}
//継承関係子クラスBは親クラスAを継承しますクラスとクラスの継承は単一継承です
クラスBはAを拡張します{

}
//インターフェース
インターフェースC {を 作成する

}
インターフェイスD {

}
//インターフェース間には複数の継承があり、コンマで区切られています。
インターフェースE extends C、D {

}
//関係クラスの複数の実装を実装し、インターフェイス
クラスFはC、D {を実装し ます

}

おすすめ

転載: blog.csdn.net/MIRACLE_Ying/article/details/112797886