uperキーワード
素晴らしい
superは、親クラスへの参照です。
superは、サブクラスコンストラクターで親クラスのコンストラクターを呼び出すことができます
コンストラクターが親クラスのコンストラクターを明示的に呼び出さない場合、コンパイラーはデフォルトのsuper()メソッド呼び出しを自動的に追加します。親クラスにデフォルトの引数なしコンストラクターがない場合、コンパイラーはエラーを報告し、super()ステートメントはコンストラクターの最初の句である必要があります。
superは、分子の親クラス内の同じ名前のメンバーを区別するために使用できます
同じ名前で問題がない場合は、サブクラスの親クラスのコンテンツを直接呼び出すことができ、デフォルトではsuperは省略されています
同じ名前で問題が発生した場合は、サブクラスで同じ名前のメンバーを呼び出します。デフォルトはこれです。Hengyuanは、現在のサブクラスで同じ名前のメンバーを呼び出し、最初に親クラスで同じ名前のメンバーを呼び出します。これは、スーパーとして定義する必要があります。
//父类
public class Animal {
int eye = 2;
public Animal(){
super();
System.out.println("动物");
}
public void run(){
System.out.println("动物有不同走路方式");
}
public static void main(String[] args) {
Bird b = new Bird();
b.run();
}
}
//子类
class Bird extends Animal{
public Bird(){
super();
System.out.println("鸟类");
}
public void run() {
super.run(); // 通过super可以用父类方法和属性
System.out.println("鸟是飞飞飞飞飞飞");
System.out.println("鸟类有"+super.eye+"只眼睛");
}
}
鳥->動物->オブジェクトグラフィック分析は次のとおりです
構築メソッドの呼び出しシーケンス:
- superの説明によると、コンストラクターの最初の文は常に次のとおりです。親クラスの対応するコンストラクターを呼び出すsuper(...)。
- 最初にオブジェクトにトレースバックし、次にクラスの初期化ブロックと構築メソッドを現在のサブクラスまで順番に実行します。
これとスーパーの違い
同じ点:
- これとスーパーの両方を使用して他の共同構築者を動員することができ、それらは最初の行に表示される必要があります
- thisとsuperはどちらも同じ名前の問題を区別するために使用でき、同じ名前が区別されない場合は省略できます。
- thisとsuperはどちらもオブジェクトを参照するため、静的環境ではどちらも使用できません。含む:静的変数、静的メソッド、静的ステートメント
ピース。
差:
- この(パラメーター)コンストラクターの最初の行は、このクラスの他のコンストラクターを呼び出し、スーパー(パラメーター)コンストラクターの最初の行は、親クラスのコンストラクターを呼び出します。
- これは、メンバーと同じ名前のローカル問題を区別するために使用され、superは、分子の親クラス内の同じ名前の問題を区別するために使用されます。
注意:
-
これとsuperは、必然的に他のコンストラクターを呼び出すため、同じコンストラクターに同時に表示することはできません。また、他のコンストラクターにもsuperステートメントが必要であるため、同じコンストラクターに同じステートメントがある場合、それは失われます。ステートメントの意味、コンパイラは渡されません。
- 基本的に、これはこのオブジェクトへのポインタですが、superはJavaキーワードです
キーワードの書き換えと最終
オーバーライド
親クラスの関数実装はサブクラスの要件を満たしていないため、必要に応じてサブクラスで書き換えることができます。これはメソッドの書き換えです。
書き換えの3つの条件:
- 2つの異なるクラス
- 継承関係|実現関係
- 同じメソッド署名
@Override:注釈、それがオーバーライドメソッドであるかどうかの必須チェック
注意:
- サブクラスによってオーバーライドされたメソッドは、親クラスのメソッドをシールドします。
- サブクラスオブジェクトが呼び出されると、サブクラス内のオーバーライドされたメソッドが呼び出され、サブクラスは親クラスを見つけられません。
public class OverrideTest {
public static void main(String[] args) {
Sicong sicong=new Sicong();
sicong.getMoney(); //调用子类中重写方法
}
}
//父类
class Jianlin{
public void getMoney(){
System.out.println("先定一个小目标,赚他个一个亿");
}
}
//子类
class Sicong extends Jianlin{
@Override //强制检查是否为重写方法
public void getMoney(){
super.getMoney();//在父类的原赚钱方法上扩展新功能,老功能不变
System.out.println("我认识的人都没我有钱");
}
}
3つの書き直された "=":
"==":メソッド名とパラメーターリストは同じです。
「≤」:スローされた例外タイプと戻り値タイプ。戻り値タイプが基本タイプの場合、同じである必要があり、参照データタイプのサブクラスは親クラス以下です。
「≥」:アクセス権限。サブクラスは親クラス以上です。
次の修飾子と変更されたコンテンツは書き換えることができません。
- プライベートに変更されたメソッドはオーバーライドできません
- 最終的に変更されたメソッドはオーバーライドできません
- 静的に変更されたメソッドはオーバーライドできません(サブクラスが親クラスの静的メソッドと同じ名前の場合、サブクラスのメソッドも静的である必要があります)
最終キーワード
ファイナルはファイナルを意味します。
finalは、変数、メソッド、およびクラスを変更するために使用できます。
変更された変数:変数が初期化されると、変更することはできず、むしろ定数として定義されます。
final int x=3;
//x=4; 常量不能改变
変更メソッド:finalメソッドは、サブクラスでオーバーライドできないメソッドです。
final void eat() { … }
変更されたクラス。これは、クラスを継承できないことを意味します
final class Person{ … }
オブジェクトクラス
オブジェクトクラスは、すべてのJavaクラスのルート基本クラスです。
extendsキーワードがクラス宣言でその基本クラスを示すために使用されていない場合、デフォルトの基本クラスはObjectクラスです。
toString():オブジェクトの参照を出力するとき、デフォルトでtoString()メソッドが呼び出されます
- デフォルトの戻り値:パッケージ名+クラス名+ @ +ハッシュコード(オブジェクトのメモリアドレスに従って生成され、1つだけは繰り返されません)
- 意味のある文字列の形式でオブジェクトを返すように書き直すことができます(オブジェクトのすべてのメンバー属性の値を出力します)
User p1=new User("张三",20);
System.out.println(p1);
//相当于
System.out.println(p1.toString());
等しい:等しいかどうかを比較する**
-
デフォルトのアドレス比較(「最初のボックスの比較」)
- 2つのオブジェクトの内容が一貫しているかどうかを比較するために、書き換えを行うことができます。
object1.equals(object2)
如 : p1.equals(p2)
• 比较所指对象的内容是否一样,具体看equals的方法重写
object1 == object2
如:p1==p2
• 比较p1和p2的值即内存地址是否相等,即是否是指向同一对象。
注:カスタムクラスはequals()をオーバーライドする必要があります。そうしないと、コンテンツを比較できません。
class User{
String name;
int age;
public User() {
// TODO Auto-generated constructor stub
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
//重写toString
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
//重写equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}