JavaSE オブジェクト指向クラス、継承、ポリモーフィズム
授業は理解していますか?
1 Java では、クラス ファイルは接尾辞 .java が付いたコード ファイルです。各クラス ファイルに含めることができるパブリック クラスは 1 つだけです。パブリック クラスがある場合、クラス ファイルの名前は次のようにする必要があります。 public クラスと同じです。 public クラスが存在しない場合、クラス ファイルの名前は任意の名前になります。
2 クラス内で、メンバー変数について、定義時に明示的な代入の初期化がない場合、Java はクラスの各メンバー変数が適切に初期化されていることを確認します
1) char、short、byte、基本データの変数の場合int、long、float、double などの型はデフォルトで 0 に初期化されます (ブール変数はデフォルトで false に初期化されます)。
2) 参照型変数の場合、デフォルトで null に初期化されます。3 コンストラクターが明示的に定義されていない場合、コンパイラーはパラメーターなしのコンストラクターを自動的に作成します。コンストラクターが明示的に定義されている場合、コンパイラーはコンストラクターを自動的に追加しません。デフォルトではすべてのコンストラクターが静的であることに注意してください。
-
4 クラスがオブジェクトをインスタンス化する順序
1) プログラムが実行されると、Java 実行エンジンはまず、クラスがロードされているかどうかを確認します。オブジェクトが最初にロードされるので、オブジェクトを再度生成します。ロードされている場合は、オブジェクトを直接生成します。
2) クラスのロード処理中に、クラスの静的メンバー変数が初期化されます。また、クラス内に静的ステートメント ブロックがある場合は、静的ステートメント ブロックが実行されます。静的メンバー変数と静的ステートメント ブロックの実行順序は、コード内の順序と一致します。
3) Java では、クラスはオンデマンドでロードされます。このクラスは必要なときに 1 回だけロードされます。
次の例を見て理解してください:public class Bread { static { System.out.println("Bread is loaded"); } public Bread() { System.out.println("bread"); } public static void main(String[] args) throws ClassNotFoundException { Bread bread1 = new Bread(); Bread bread2 = new Bread(); } }
ログイン後にコピーこのコードを実行すると、「Bread isloaded」が 1 回だけ出力されることがわかります。
4) オブジェクトを生成するプロセスでは、最初にオブジェクトのメンバー変数が初期化され、その後コンストラクターが実行されます。これは、変数がメソッド定義の間に散在している場合でも、クラス内の変数はメソッド (コンストラクターを含む) が呼び出される前に初期化されることを意味します。public class Test { public static void main(String[] args) { new Meal(); } } class Meal { public Meal() { System.out.println("meal"); } Bread bread = new Bread(); } class Bread { public Bread() { System.out.println("bread"); } }
ログイン後にコピー出力結果は次のようになります:
bread meal
ログイン後にコピー
継承について理解していますか?
-
1 継承
1) 継承はすべての OOP 言語に不可欠な部分であり、Java では継承関係を示すために extends キーワードが使用されます。クラスを作成すると、継承するクラスが明示的に指定されていない場合は、常にルート クラスの Object から暗黙的に継承されます。たとえば、次のコード:class Person { public Person() { } } class Man extends Person { public Man() { } }
ログイン後にコピー2) Man が person クラスから継承するクラス。この場合、person クラスは親クラス (基本クラス) と呼ばれ、Man クラスはサブクラス (派生クラス) と呼ばれます。 。 2 つのクラス間に継承関係がある場合、サブクラスは親クラスのメソッドと変数を自動的に継承し、親クラスのメソッドと変数をサブクラスで呼び出すことができます。
3) Java では、単一継承のみが許可されます。つまり、クラスは最大でも 1 つの親クラスからのみ明示的に継承できます。ただし、クラスは複数のクラスに継承できます。つまり、クラスは複数のサブクラスを持つことができます。 2 サブクラスは親クラスの属性を継承します
サブクラスは、あるクラスを継承する際、親クラスのメンバ変数を利用することができますが、親クラスのメンバ変数をすべて完全に継承するわけではありません。具体的な原則は次のとおりです:
1) 親クラスの public および protected メンバー変数は継承できますが、親クラスの private メンバー変数は継承できません。
2) 親クラスのパッケージ アクセス許可メンバー変数の場合。 、サブクラスと親クラスが同じパッケージ内にある場合、サブクラスは継承できます。それ以外の場合、サブクラスは継承できません。
3) サブクラスが継承できる親クラスのメンバー変数の場合、サブクラスに同じ名前が出現すると、 隠れ 現象が発生します。つまり、サブクラスのメンバー変数が、同じ名前の親クラスのメンバー変数をブロックします。親クラスの同名のメンバ変数にサブクラスでアクセスしたい場合は、super キーワードを使用して参照する必要があります。3 サブクラスは親クラスのメソッドを継承します
同様に、サブクラスは親クラスのメソッドをすべて完全に継承するわけではありません。
1) 親クラスのパブリックおよび保護されたメンバー メソッドを継承できますが、親クラスのプライベート メンバー メソッドは継承できません。
2) サブクラスと親クラスが存在する場合、親クラスのパッケージ アクセス メンバー メソッドの場合。同じパッケージの場合、サブクラスは継承できます。それ以外の場合、サブクラスは継承できません。
3) サブクラスが継承できる親クラスのメンバー メソッドの場合、同じ名前のメンバー メソッドがサブクラスに存在する場合、それは オーバーライド と呼ばれます。つまり、サブクラスのメンバー メソッドは、同じ名前の親クラスのメンバー メソッドをオーバーライドします。親クラスの同名のメンバメソッドにサブクラスでアクセスしたい場合は、superキーワードを使用して参照する必要があります。4 注意
非表示とカバーは異なります。
非表示はメンバー変数と静的メソッド用であり、
オーバーライドは通常のメソッド用です。5 构造器
1)子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。
2)如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。6 super主要有两种用法
1)super.成员变量/super.成员方法;
2)super(parameter1,parameter2....)
第一种用法主要用来在子类中调用父类的同名成员变量或者方法;
第二种主要用在子类的构造器中显示地调用父类的构造器
要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。
你了解多态吗?
1 子类必是父类,所以父类型的引用可以指向子类型的对象。
-
2 动态绑定方法的多种不同版本(即非编译时绑定,而是晚绑定或者动态绑定)
Parent p = new Child(); p.eat();
ログイン後にコピー此时Parent和Child中必须都有eat()方法;
即多态进行动态绑定的前提条件是继承,子类必须继承父类的方法,才能使用父类的引用进行方法调用。 3 父类引用能向下转换成子类引用的前提是父类引用指向子类的对象。
4 向下转换后的引用,就可以调用子类特有的方法了。
5 多态的好处,定义方法时,出入参可以申明为父类的类型,传参时,可以传递子类的对象。这样在方法不改变的前提下,就可以扩展子类的种类,添加新的逻辑。
-
6 覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。
1)举例如下public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.out.println(shape.name); // 成员变量(隐藏) shape.printName(); // 静态方法(隐藏) shape.printType(); // 非静态方法(覆盖) } } class Shape { public String name = "shape"; public Shape(){ System.out.println("shape constructor"); } public void printType() { System.out.println("this is shape"); } public static void printName() { System.out.println("shape"); } } class Circle extends Shape { public String name = "circle"; public Circle() { System.out.println("circle constructor"); } public void printType() { System.out.println("this is circle"); } public static void printName() { System.out.println("circle"); } }
ログイン後にコピー2)输出结果:
shape constructor circle constructor shape shape this is circle
ログイン後にコピー3)原因分析
覆盖受RTTI(Runtime type identification)约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。因此,就会出现上面的输出结果。
以上がJavaSE オブジェクト指向クラス、継承、ポリモーフィズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









関数の継承では、「基底クラス ポインター」と「派生クラス ポインター」を使用して継承メカニズムを理解します。基底クラス ポインターが派生クラス オブジェクトを指す場合、上方変換が実行され、基底クラスのメンバーのみにアクセスされます。派生クラス ポインターが基本クラス オブジェクトを指す場合、下向きキャストが実行される (安全ではない) ため、注意して使用する必要があります。

仮想基本クラスは、追加の vtable を作成せずに複数の基本クラスからの継承を許可することで、vtable のメモリ オーバーヘッドを最適化します。最適化されたコードでは、形状基本クラスに仮想関数テーブルがなくなり、円クラスと長方形クラスが同じ仮想関数テーブルを共有するため、メモリ消費量が削減されます。

継承とポリモーフィズムはクラスの結合に影響します。派生クラスは基本クラスに依存するため、継承により結合が増加します。ポリモーフィズムにより、オブジェクトは仮想関数と基本クラス ポインターを通じて一貫した方法でメッセージに応答できるため、結合が軽減されます。ベスト プラクティスには、継承を控えめに使用すること、パブリック インターフェイスを定義すること、基本クラスへのデータ メンバーの追加を回避すること、依存関係の注入を通じてクラスを分離することが含まれます。ポリモーフィズムと依存性注入を使用して銀行口座アプリケーションの結合を軽減する方法を示す実践的な例。

継承エラーのデバッグのヒント: 正しい継承関係を確認します。デバッガーを使用してコードをステップ実行し、変数値を調べます。仮想修飾子を正しく使用してください。隠れた相続によって引き起こされる相続ダイアモンド問題を調べてください。抽象クラスに実装されていない純粋仮想関数がないか確認します。

C++の関数継承を詳しく解説:「is-a」と「has-a」の関係をマスターしよう 関数継承とは?関数の継承は、派生クラスで定義されたメソッドを基本クラスで定義されたメソッドに関連付ける C++ の手法です。これにより、派生クラスが基本クラスのメソッドにアクセスしてオーバーライドできるようになり、基本クラスの機能が拡張されます。 「is-a」および「has-a」関係 関数継承では、「is-a」関係は、派生クラスが基本クラスのサブタイプであること、つまり、派生クラスが基本クラスの特性と動作を「継承」することを意味します。基本クラス。 「has-a」関係は、派生クラスに基本クラス オブジェクトへの参照またはポインターが含まれていること、つまり、派生クラスが基本クラス オブジェクトを「所有」していることを意味します。構文関数継承を実装する方法の構文は次のとおりです: classDerivedClass:pu

オブジェクト指向プログラミングとは何ですか?オブジェクト指向プログラミング (OOP) は、現実世界のエンティティをクラスに抽象化し、オブジェクトを使用してこれらのエンティティを表すプログラミング パラダイムです。クラスはオブジェクトのプロパティと動作を定義し、オブジェクトはクラスをインスタンス化します。 OOP の主な利点は、コードの理解、保守、再利用が容易になることです。 OOP の基本概念 OOP の主な概念には、クラス、オブジェクト、プロパティ、メソッドが含まれます。クラスはオブジェクトの設計図であり、オブジェクトのプロパティと動作を定義します。オブジェクトはクラスのインスタンスであり、クラスのすべてのプロパティと動作を備えています。プロパティは、データを保存できるオブジェクトの特性です。メソッドは、オブジェクトのデータを操作できるオブジェクトの関数です。 OOP の利点 OOP の主な利点は次のとおりです。 再利用性: OOP はコードをより高度なものにすることができます。

C++ 関数の継承は、次の状況では使用しないでください。 派生クラスが異なる実装を必要とする場合、異なる実装を持つ新しい関数を作成する必要があります。派生クラスが関数を必要としない場合は、空のクラスとして宣言するか、プライベートの未実装の基本クラス メンバー関数を使用して関数の継承を無効にする必要があります。関数が継承を必要としない場合は、コードの再利用を実現するために他のメカニズム (テンプレートなど) を使用する必要があります。

インターフェイス: 実装のないコントラクト インターフェイスは、Java でメソッド シグネチャのセットを定義しますが、具体的な実装は提供しません。これは、インターフェイスを実装するクラスに、その指定されたメソッドを強制的に実装するコントラクトとして機能します。インターフェイス内のメソッドは抽象メソッドであり、メソッド本体はありません。コード例: publicinterfaceAnimal{voideat();voidsleep();} 抽象クラス: 部分的に実装されたブループリント 抽象クラスは、そのサブクラスによって継承できる部分的な実装を提供する親クラスです。インターフェイスとは異なり、抽象クラスには具体的な実装と抽象メソッドを含めることができます。抽象メソッドは、abstract キーワードを使用して宣言され、サブクラスによってオーバーライドされる必要があります。コード例: publicabstractcla
