目次
コンストラクターを除くすべてのプロパティとメソッドが継承されます。ただし、すべてを直接使用できるわけではありません。
オブジェクトを印刷するときに、toString()メソッドが呼び出されない場合、toString()メソッドが自動的に呼び出されます。戻り値:クラス名@オブジェクトアドレス
1.IDEAショートカットキーと関連操作
1.クラスの構造ビュー:alt + 7
2.クラスのソースコードを確認します:ctr | +左ボタン
3.クラスの関係を表示します:クラス名をマウスで右クリック->図- ->図を表示
4.コンストラクター、get、setメソッド、equalsなどを自動的に生成します。alt+ insert
5.マウスを置いた後、プロンプトドキュメントの説明プロンプトを設定します:[ファイル]-> [設定]-> [エディター]-> [一般]->
2. equals()関数を書き直します
Equals()関数のソースコード:
public boolean equals(Object obj) {
return (this == obj);
}
次のコードは、出力が次のようになる前に、equals()を書き換えません。
false
false
true
true
コード:
import java.util.Objects;
public class Equals {
int id;
int age;
String name;
//选取时按Ctrl选多个
public Equals(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public static void main(String[] args) {
Equals e1=new Equals(1,22,"小明");
Equals e2=new Equals(1,22,"小明");
//比较对象地址
System.out.println(e1==e2);
System.out.println(e1.equals(e2));//通过equals()方法源码可看到equals也是用==比较,即比较对象是否是一个
System.out.println("123".equals("123"));
System.out.println("123"=="123");
}
//重写equals()函数,右键Generate自动生成,根据id判断是否相等
@Override
public boolean equals(Object o) {
if (this == o) return true;
//空对象或者类型不一致
if (o == null || getClass() != o.getClass()) return false;
Equals equals = (Equals) o;
return id == equals.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
equals()を書き換えた後の出力は次のとおりです。
false
true
true
true
3.スーパーキーワード_継承ツリートレース
スーパー「と見なすことができる」は、直接の親オブジェクトへの参照です。superを使用して、サブクラスによってオーバーライドされる親クラスのメソッドまたは属性にアクセスできます。
superを使用して通常のメソッドを呼び出します。ステートメントの位置に制限はなく、サブクラスで気軽に呼び出すことができます。
これ
がsupe(..)またはthis(..);を明示的に呼び出さずに構築メソッドの最初のコード行である場合、Javaはデフォルトでsuperを呼び出します)。これは、親クラスのパラメーターなしの構築メソッドを呼び出すことを意味します。ここではsuper()を省略できます。
コード1:
public class TestSuper01 {
public static void main(String[] args) {
new ChildClass().f();
}
}
class FatherClass{
public int value;
public void f(){
value=100;
System.out.println("FatherClass.value="+value);
}
}
class ChildClass extends FatherClass{
public int value;//覆盖一个变量
public void f(){ //覆盖父类的函数
super.f();//调用父类的普通方法
value=200;
System.out.println("ChildClass.value="+value);
System.out.println(value);
System.out.println(super.value);//调用父类的成员变量
}
}
出力:
FatherClass.value=100
ChildClass.value=200
200
100
コード2:
public class TestSuper02 {
public static void main(String[] args) {
System.out.println("开始创建一个ChildClass对象......");
new ChildClass2();
}
}
class FatherClass2{
public FatherClass2(){
//这里会先去调用父类即Object类的构造函数,相当于省略了super();
System.out.println("创建FatherClass2对象");
}
}
class ChildClass2 extends FatherClass2{
public ChildClass2(){
//这里会先去调用父类即FatherClass2的构造函数,相当于省略了super();
System.out.println("创建ChildClass2对象");
}
}
出力:
开始创建一个ChildClass对象......
创建FatherClass2对象
创建ChildClass2对象