プログラミングが好きなあなたのように!
SpringBoot実用的なコースは学習https://edu.csdn.net/course/detail/31433
SpringCloud入門コースを学びhttps://edu.csdn.net/course/detail/31451を
オブジェクト指向シリーズ:
クラスとオブジェクトの
カプセル化は、ポリモーフィック静的キーワードとシングルトンモードインターフェイスおよび内部クラスを
継承します
序文
この記事では、オブジェクト指向継承のもう1つの重要な機能について説明します。継承の関連概念、スーパーキーワード、継承の構築方法、最終キーワード、および抽象メソッドについて学習します。
継承の概要
実際の継承:
プログラムの継承:
親クラスのメンバー(属性とメソッド)は、コードの再利用で役割を果たす子クラスに継承できます。
機能:
- プログラムのクラスは、親クラスとサブクラスに分けられます
- サブクラスは親クラスを継承できます。または、親クラスがサブクラスを派生していると言えます。
- サブクラスは、コードの再利用のメカニズムである親クラスのプロパティとメソッドを継承できます
2つのクラスに継承関係があることを確認するにはどうすればよいですか?
子クラスと親クラスには(一種の)関係があり、子クラスは親クラスであり、
犬は動物であり、車は乗り物です...
継承された構文
public class 子类 extends 父类{
}
ケース:学生の相続人である学生は、人間に共通の属性とメソッドを継承でき、独自の属性とメソッドを定義するだけで済みます。これにより、重複するコードの記述が大幅に削減されます。
/**
* 人类
*/
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.printf("%d的%s在吃东西\n",age,name);
}
}
/**
* 学生类
*/
public class Student extends Person{
//学号
private String no;
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public Student(){
}
public Student(String no,String name,int age) {
this.no = no;
//调用了父类的方法
this.setName(name);
this.setAge(age);
}
public void study(){
//调用了父类的方法
System.out.printf("%d岁的学号%s的%s同学在学习Java",this.getAge(),this.getName(),no);
}
}
public class StudentDemo {
public static void main(String[] args) {
Student stu = new Student("001","张三",20);
//调用父类方法
stu.eat();
//调用自身方法
stu.study();
}
}
Javaでの継承
- 推移性、親クラスのメンバーはサブクラス、およびサブクラスのサブクラスに渡すことができます
- シングルルートのサブカテゴリには、親カテゴリを1つだけ含めることができます
スーパーキーワード
superは、親クラスオブジェクトを表します。
関数は次のとおりです。
- 親クラスのプロパティを呼び出す
super.属性
- 親クラスのメソッドを呼び出す
super.方法(..)
- 親クラスのコンストラクターを呼び出す
super(参数);
スーパーとこれの違い:
- これは現在のクラスのオブジェクトを表し、superは親クラスのオブジェクトを表します
- これは、現在のクラス(独自の親クラスを含む)
のプロパティとメソッドを呼び出すことができます。superは、親クラスのプロパティとメソッドのみを呼び出すことができます。 - これは独自のコンストラクターを呼び出すことができ、superは親クラスのコンストラクターを呼び出すことができます
superは、親クラスのコンストラクターを呼び出します。
给父类添加构造方法:
public Person() {
System.out.println("这是Person无参的构造方法");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("这是Person带参的构造方法");
}
给子类添加构造方法:
public Student(){
System.out.println("这是Student无参的构造方法");
}
public Student(String no,String name,int age) {
//调用了父类的构造方法
super(name,age);
this.no = no;
System.out.println("这是Student带参的构造方法");
}
调用子类:
Student stu = new Student();
Student stu1 = new Student("001","张三",20);
注意:
- サブクラスがsuperを書き込まない場合、システムはデフォルトで親クラスのパラメーターなしの構築メソッドを呼び出します。
- 親クラスのパラメーターを使用してコンストラクターを呼び出す場合、サブクラスはsuperを使用して、親クラスのコンストラクターを明示的に呼び出す必要があります。
- super()は、サブクラス構築メソッドの最初の行に表示される必要があります
- 構築メソッドの呼び出しは、常に最初に親クラスを呼び出し、次にサブクラスを呼び出します
メソッドの書き換え
メソッド書き換えとは何ですか?
サブクラスのメソッドは、親クラスのメソッドをオーバーライドできます。
メソッドオーバーライドの特性は次のとおりです。
- サブクラスと親クラスのメソッド
- 同じメソッド名
- パラメータと戻り値は同じです
- サブクラスメソッドのアクセス修飾子は、親クラスよりも厳密にすることはできません
学生クラスは、親クラスのeatメソッドをオーバーライドします
//重写父类的方法
public void eat(){
System.out.printf("%d的%s同学在吃KFC\n",this.getAge(),this.getName());
}
Student stu1 = new Student("001","张三",20);
stu1.eat();
オブジェクトクラス
Objectクラスは
、Javaのすべてのクラスの親クラスであるObjectクラスの共通メソッドです。
- 等しい比較等しい
- hashCodeはハッシュコードを返します
- getClassは、オブジェクトの型情報を返します
- toStringは、オブジェクトの文字列情報を返します
==と等しい
==の違い基本タイプの場合は値を比較し
、参照タイプの場合はメモリアドレスを比較します。
ソースコードは==で実装されているため、Objectクラスのequalsはオブジェクトのアドレスも比較します。
public boolean equals(Object obj) {
return (this == obj);
}
String型の場合、StringクラスはObjectクラスのequalsメソッドをオーバーライドするため、equalsは文字コンテンツを比較します
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
次のコードの実行結果を考えてみましょう。
String s1 = "abcd";
String s2 = "abcd";
String s3 = new String("abcd");
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s2.equals(s3));
「abcd」などの定数値の場合、それらは定数プールに割り当てられます。文字列定数は繰り返し使用できます。
コードの1行目と2行目の「abcd」は同じ定数です。
コードの3行目はnewを使用しており、ヒープ内に新しいオブジェクトを作成します。
コードの4行目s1とs2は同じオブジェクトであり、結果はtrue
です。コードの5行目s2とs3は同じオブジェクトではありません。結果は偽で
あり、コードの6行目は等しいです。文字列、そして結果は真です
最終キーワード
クラス、変数、メソッドを変更するために使用されます
- finalで変更されたクラスは継承できません
final class A{}
class B exends A{} //错误
- finalによって変更された変数は定数になり、値を変更できません
final int num = 2000;
num++; //错误
- finalによって変更されたメソッドはオーバーライドできません
class A{
public final void test(){}
}
class B extends A{
public void test(){} //错误
}
抽象メソッドと抽象クラス
実際の開発プロセスでは、特定のメソッドの特定の実装をサブクラスの実装に延期する必要がある場合があります。
抽象メソッドの重要性は次のとおりです。
- メソッド定義(戻り値の型、メソッド名、パラメーター)を標準化できます
- 特定の実装はサブクラスによって完了します
抽象的方法:
public abstract 返回值 方法名(类型 参数);
抽象クラス
abstract class 类名{
}
Personクラスを変更する
/**
* 抽象类
*/
public abstract class Person {
....省略其他代码
//抽象方法
public abstract void eat();
}
注意:
- 抽象メソッドがクラスで定義されたら、そのクラスは抽象クラスとして定義する必要があります
- 抽象メソッドを持つクラスは抽象クラスである必要があります。抽象クラスには必ずしも抽象メソッドがあるとは限りません。
抽象クラスの特徴
- 抽象クラスはインスタンス化できません
- サブクラスも抽象でない限り、抽象クラスはサブクラスに継承され、抽象メソッドを実装する必要があります
終わり
最後に、プログラミングに関する2つの質問を残しておきます
。1。車両のカテゴリ、属性:色、速度、燃料消費量、方法:移動、停止を定義します。
車のクラスと船のクラスを定義して、輸送手段を継承します。車のクラスにはブランド属性とブレーキ方法があり、
船には変位属性とアンカー方法があります。
車と船のオブジェクトを作成し、すべてのメソッドを呼び出します。
2.家電製品のカテゴリを定義し、電力、価格、ブランド属性を定義し、これらの属性を出力するための起動方法を定義します。
TVクラスを定義し、家電クラスを継承し、再生メソッドを追加します。
TVオブジェクトを作成し、playbackメソッドを呼び出します。
最後に、パラメータ化された構築メソッドを家電製品に追加し、superを使用してTVで親構築メソッドを呼び出します。
他のJavaの知識を学ぶ必要がある場合は、ここでJavaの概要に関する非常に詳細な知識を調べてください。