Javaキーワード(2):これとスーパー
序文
このブロガーはCSDNを使用して、ソフトウェア開発と学習の過程で得られ、学んだ経験と知識を記録します。興味のある友人はブロガーをフォローできます。
たぶん一人で歩いている人は非常に速く行くことができますが、一緒に歩いている人々のグループはさらに進むことができます!成長の道でお互いから学びましょう、注目してください!
1.「this」キーワードの使用
1。概要
- これは何ですか?
Javaでは、
this
キーワードは理解しにくく、その役割はその意味に非常に近く、つまり「現在」を意味します。
2.機能
⭕キーワード
this
を使用して、プロパティ、メソッド、コンストラクターを変更および呼び出すことができます。
⭕キーワードthis
はメソッド内でのみ使用できます。
⭕メソッド内で使用されます。つまり、このメソッドが属するオブジェクトへの参照です
。⭕コンストラクター内で使用され、コンストラクターが初期化しているオブジェクトを示します。
3.使用する
- このキーワードはいつ使用しますか?
これは、メソッドを呼び出すオブジェクトをメソッド内で使用する必要がある場合に使用されます
this
。具体的:プロパティとローカル変数this
を区別するために使用ます。例えば:this.name = name;
3.1変更されたプロパティとメソッド
⭕
this
は次のように理解されます:現在のオブジェクトまたは現在作成されているオブジェクト
⭕クラスのメソッドでは、またはメソッドを使用して、現在のオブジェクトのプロパティthis.属性
またはthis.方法
メソッドを呼び出すことができます。ただし、多くの場合、を省略することを選択しますthis.
。特別な場合、メソッドの仮パラメーターとクラスのプロパティが同じ名前である場合はthis.变量
、メソッドを明示的に使用して、この変数が仮パラメーターではなくプロパティであることを示す必要があります。
⭕this
アクセスプロパティとメソッドを使用するときに、このクラスで見つからない場合は、親クラスから検索されます。
コードデモ:
class Person{
// 定义Person类
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ; }
public void getInfo(){
System.out.println("姓名:" + name) ;
this.speak();
}
public void speak(){
System.out.println(“年龄:” + this.age);
}
}
3.2コンストラクターの呼び出し
⭕クラスのコンストラクターでは、orメソッドを使用して、現在作成されているオブジェクトのプロパティ
this.属性
またはthis.方法
メソッドを呼び出すことができます。ただし、多くの場合、を省略することを選択しますthis.
。特別な場合、コンストラクターのパラメーターとクラスのプロパティが同じ名前である場合はthis.变量
、メソッドを明示的に使用して、この変数がパラメーターではなくプロパティであることを示す必要があります。
⭕クラスのコンストラクターでは、このクラスで指定された他のコンストラクターを明示的に呼び出すことができます
this(形参列表)
。
⭕コンストラクターは
this(形参列表)
、手段によって独自のコンストラクターを呼び出すことはできません。
⭕クラスにn個のコンストラクターがある場合、最大でn-1個のコンストラクターが使用されます
this(形参列表)
⭕要件:現在のコンストラクターの最初の行で
this(形参列表)
宣言する必要があります。
⭕コンストラクター内では、他のコンストラクターを呼び出すように宣言できるのは最大で1つです。
this(形参列表)
⭕コンパイラは、コンストラクタ以外のメソッドからコンストラクタを呼び出すことを禁止しています。
コードデモ:
class Person{
// 定义Person类
private String name ;
private int age ;
public Person(){
// 无参构造器
System.out.println("新对象实例化") ;
}
public Person(String name){
this(); // 调用本类中的无参构造器
this.name = name ;
}
public Person(String name,int age){
this(name) ; // 调用有一个参数的构造器
this.age = age;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age ;
}
}
3.3現在のオブジェクトを返す
コードデモ:
public class Leaf {
int i = 0;
Leaf increment(){
i++;
return this;
}
void print(){
System.out.println("i = "+i);
}
public static void main(String args[]){
Leaf x = new Leaf();
x.increment().increment().increment().print();//i = 3
}
}
第二に、「スーパー」キーワードの使用
1。概要
(1)
super
次のように理解されます:親クラス
(2)Javaクラスでsuperを使用して、親クラスで指定された操作を呼び出します
。⭕親クラスで定義されたプロパティsuper
にアクセスするために使用できます。⭕は、親クラスで定義されたメンバーメソッドを呼び出すために使用できます。⭕サブクラスのコンストラクターでスーパークラスのコンストラクターを呼び出すために使用できます。⭕特に、子の親クラスに同じ名前のメンバーがある場合、親クラスのメンバーが呼び出されたことを示すために使用でき、トレースバックは直接の親クラスに限定されません。⭕の使用法は、このクラスのオブジェクトへの参照および親クラスのメモリ空間の識別の使用法と同様です。super
super
super
super
super
this
this
super
2.使用する
親クラスの構造は、子クラスで明示的に呼び出すことができます。
3.使用する
3.1プロパティとメソッドの呼び出し
⭕サブクラスのメソッドまたはコンストラクターで実行できます。
super.属性
「 」または「 」を使用super.方法
して、親クラスで宣言されたプロパティまたはメソッドを明示的に呼び出します。ただし、通常は「super.
」を省略します。
⭕サブクラスと親クラスで同じ名前のプロパティが定義されている場合、サブクラスの親クラスで宣言されたプロパティを呼び出す場合は、明示的に "
super.属性
"メソッドを使用して、呼び出しがで宣言されていることを示す必要があります。親クラス。属性。
⭕サブクラスが親クラスのメソッドを書き換えるとき、サブクラスのメソッドで親クラスのオーバーライドされたメソッドを呼び出すときは、明示的に「
super.方法
」を使用して、親クラスが呼び出されることを示す必要があります。 。
3.2コンストラクターの呼び出し
(1)デフォルトでは、サブクラスのすべてのコンストラクターは、親クラスの空のパラメーターを使用してコンストラクターにアクセスします。
(2)親クラスに空のパラメーターを持つコンストラクターがない場合、サブクラスのコンストラクターは、this(パラメーターリスト)またはsuper(パラメーターリスト)ステートメントを介して、このクラスまたは親クラスの対応するコンストラクターへの呼び出しを指定する必要があります、それ以外の場合はコンパイルエラー。同時に、「2つのうちの1つを選択」することしかできず、両方を選択することはできず、コンストラクターの最初の行に配置する必要があります。
(3)クラスの複数のコンストラクターのうち、少なくとも1つのクラスコンストラクターが「super(仮パラメーターリスト)」を使用して親クラスのコンストラクターを呼び出します。
コードデモ:
public class Person {
private String name;
private int age;
private Date birthDate;
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d; }
public Person(String name, int age) {
this(name, age, null);
}
public Person(String name, Date d) {
this(name, 30, d);
}
public Person(String name) {
this(name, 30);
}
}
public class Student extends Person {
private String school;
public Student(String name, int age, String s) {
super(name, age);
school = s;
}
public Student(String name, String s) {
super(name);
school = s;
}
// 编译出错: no super(),系统将调用父类无参数的构造器。
public Student(String s) {
school = s;
}
}
3.これとスーパーの違い
いいえ。 | 違い | これ | 素晴らしい |
---|---|---|---|
1 | アクセスプロパティ | このクラスのプロパティにアクセスします。このクラスにこのプロパティがない場合は、親クラスから検索を続けます | 親クラスのプロパティへの直接アクセス |
2 | メソッドを呼び出す | このクラスのメソッドにアクセスします。このクラスにこのメソッドがない場合は、親クラスから検索を続けます | 親クラスのメソッドへの直接アクセス |
3 | コンストラクターを呼び出す | このクラスのコンストラクターの呼び出しは、コンストラクターの最初の行に配置する必要があります | スーパークラスコンストラクターを呼び出します。これは、サブクラスコンストラクターの最初の行に配置する必要があります |
第4に、サブクラスオブジェクトのインスタンス化のプロセス全体
(1)結果から判断:(継承)
⭕サブクラスは親クラスを継承した後、親クラスで宣言されたプロパティまたはメソッドを取得します。
⭕サブクラスのオブジェクトを作成します。ヒープスペースに、親クラスで宣言されたすべてのプロパティが読み込まれます。
(2)プロセスの観点から:
サブクラスのコンストラクターを介してサブクラスオブジェクトを作成する場合、その親クラスのコンストラクターを直接または間接的に呼び出してから、親クラスの親クラスのコンストラクターを呼び出す必要があります。 。クラスjava.lang.Object
内の空のパラメーターのコンストラクターが呼び出されるまで。これは、親クラスのすべての構造がロードされているため、メモリ内の親クラスの構造を確認でき、サブクラスオブジェクトを呼び出すことを検討できます。
(3)クリア:サブクラスオブジェクトの作成時に親クラスのコンストラクターが呼び出されますが、オブジェクト、つまりサブクラスオブジェクトが最初から最後まで作成されてい
new
ます。