この記事では、Java 継承とは何かについて説明します。 Java で継承を使用するにはどうすればよいですか? 、初心者に継承の使用方法を教え、継承の概念を理解させます。アクセス修飾子とfinalキーワードの使い方をマスターしましょう。困っている友人は参考にしていただければ幸いです。
まず、これら 2 つのクラスを見てみましょう:
public class Teacher { private int teachingAge; private String name; private int age; public void teach() { } public void seyHi() { System.out.println("我是:"+this.name); } }
public class Student { private int studentNo; private String name; private int age; public void learn() { } public void seyHi() { System.out.println("我是:"+this.name); } }
Student クラスと Teacher クラスには、いくつかの類似点 プロパティとメソッド、これらは重複コードです。プログラム内に多数のクラスがある場合、大量の重複コードが生成されます。これらの繰り返しコードを抽出して他のクラスで使用して、単純化することはできますか?つまり、 を使用して を継承します。
継承の最適化を使用した後:
継承パッケージを作成します
親クラス: (パブリック コード クラス)
package inherit; public class People { private String name; private int age; public void sayHi() { System.out.println("我是:"+this.name); } 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; } }
サブクラス: Student.java
package inherit; public class Student extends People{ private int studentNo; public void learn() { System.out.println("学习课程"); } public int getStudentNo() { return studentNo; } public void setStudentNo(int studentNo) { this.studentNo = studentNo; } }
サブクラス: Teacher.java
package inherit; public class Teacher extends People{ private int teachingAge; public void teach() { System.out.println("教授课程"); } public int getTeachingAge() { return teachingAge; } public void setTeachingAge(int teachingAge) { this.teachingAge = teachingAge; } }
テスト クラス:
package inherit; public class TestInherit { public static void main(String[] args) { //创建Student对象 Student stu=new Student(); stu.setName("张三");//父类中继承过来的方法 stu.learn();//子类中特有的方法 stu.sayHi(); //创建Teacher对象 Teacher teacher=new Teacher(); teacher.setName("汤尼"); teacher.setTeachingAge(2);//子类中特有的方法 teacher.sayHi(); } }
上記のコード例を観察すると、次のことがわかります。
1. サブクラスのすべてのパブリック コードは次のとおりです。親クラス
#2に配置されます。サブクラスは独自のメソッドと属性を持つことができます#3。サブクラスが親クラスを継承すると、親クラスの属性とメソッドを持つようになります。
4. コードを均一に変更しやすくするために、パブリック コードを親クラスに配置します。
#継承された構文##キーワード:
extends1. 親クラスを作成します<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="java">public class 父类{
//公共的属性和方法
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
2. サブクラスを作成し、親クラスを継承します
public class 子类 extends 父类{ //子类特有的属性和方法 }
#サブクラスは 1 つの親クラスのみを継承します
サブクラスは親クラスのメンバーにアクセスできますキーワードを使用する必要があります。親クラス構造にアクセスするための親クラス オブジェクトを表します。メソッド:サブクラスが親クラスのメンバーにアクセスしたい場合は、
super
super();//访问无参构造 super(参数);//访问有参构造
super.name;
親クラス メソッドにアクセス:
super.print();
親クラスのコンストラクターにアクセスします。子クラスのコンストラクター メソッドで呼び出す必要があります。最初の文である必要があります。super はサブクラスのメソッドとコンストラクターにのみ使用できます
super は親クラスのプライベート メンバーにアクセスできませんノックノック: 親クラスのメンバーにアクセスします
パッケージ visitparent を作成し、レポートの下に次のクラスを作成します
親クラス
package visitparent; public class Animal { private String name; private int legs; public Animal() { this.name="无名"; this.legs=4; } public Animal(String name,int legs) { this.name=name; this.legs=legs; } public void eat(String food) { System.out.println(name+" 吃食物:"+food); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getLegs() { return legs; } public void setLegs(int legs) { this.legs = legs; } }
サブクラスサブクラスは親クラスのプライベート メンバーを継承できません
package visitparent; public class Cat extends Animal{ private String hairColor;//毛发颜色 private int age; public Cat () { super();//调用父类无参 } public Cat(String name,int legs,String hairColor,int age) { super(name, legs);//这里调用相当于重用父类构造方法了 this.hairColor=hairColor; this.age=age; //super(name, legs);//去掉注释试试 //this.name="无名";//去掉注释试试 } public void catchMouse() { System.out.println(super.getName()+":抓老鼠"); } public void paly() { System.out.println(super.getName()+" 玩累了。"); super.eat("小鱼干"); } public String getHairColor() { return hairColor; } public void setHairColor(String hairColor) { this.hairColor = hairColor; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }ログイン後にコピー
サブクラスは、親クラスのプライベート メンバーを継承できません。デフォルトのアクセス権限を使用します (デフォルトのアクセス権限ではアクセス修飾子は書き込まれません)
サブクラスは親クラスのコンストラクタを継承できません多重継承の実行プロセス
以下の 3 つのクラスを作成して、クラス C がクラス B を継承し、クラス B がクラス A を継承します。サブクラスを作成するとき、親クラスは何をしますか?
B.javaA.java
public class A { public A() { System.out.println("A类的无参构造函数执行"); } }ログイン後にコピー
public class B extends A{ public B() { System.out.println("B类的无参构造函数执行"); } }
public class C extends B{ public C() { System.out.println("C类的无参构造函数执行"); } }
public class TestRunFlow { public static void main(String[] args) { C c=new C(); } }
クラス B のパラメータなしコンストラクタが実行されます。
クラス C のパラメータなしコンストラクタが実行されます。サブクラス コンストラクターがスーパーを通じて親クラスの対応するコンストラクターを明示的に呼び出す場合、親クラスのパラメーターなしのコンストラクターは実行されません。メソッド
最上位の親クラスのパラメータなしのコンストラクタが実行されるまで、親クラスのパラメータなしのコンストラクタを呼び出します
#親クラスサブクラスpublic class Pet { private String name; public Pet(String name) { this.name=name; } }ログイン後にコピー
public class Dog extends Pet{ }
答えは「ノー」です。親クラスにはパラメータ化されたコンストラクタのみがあり、パラメータなしのコンストラクタはありません。デフォルトでは、クラス内のコードには暗黙的なパラメータなしのコンストラクタがあり、サブクラスのパラメータなしのコンストラクタは、デフォルトで親クラスのパラメータなしのコンストラクタを呼び出しません。親クラスであるため、子クラスでエラーが報告されます。 解決策: 1. 親クラスにパラメーターなしのコンストラクターを明示的に追加します。 2. サブクラスのコンストラクターで親クラスのパラメーター化されたコンストラクターを明示的に呼び出します。
java のアクセス修飾子protected アクセス修飾子は、変更後に、このクラス、サブクラス、および同じパッケージからプロパティとメソッドにアクセスできます。
#アクセス修飾子
このクラス
同じパッケージ
サブクラス
√ | ||||
---|---|---|---|---|
√ | √ | #保護済み | ||
√ | √ | public | √||
√ | √ |