this

this は自身のオブジェクトであり、オブジェクト自体を表します。次のように理解できます:オブジェクト自体を指すポインタ。

this の使い方は Java では大きく分けて3つあります:

1. 通常の直接参照

これは説明するまでもなく、this は現在のオブジェクト自体を指すことに相当します。

2. 仮引数とメンバー名が同じ場合、this を使って区別します:

实例

class Person { private int age = 10; public Person(){ System.out.println("初始化年龄:"+age); } public int GetAge(int age){ this.age = age; return this.age; } } public class test1 { public static void main(String[] args) { Person Harry = new Person(); System.out.println("Harry's age is "+Harry.GetAge(12)); } }

运行结果:

初始化年龄:10
Harry's age is 12

見てわかるように、ここでの age は GetAge メンバーメソッドの仮引数であり、this.age は Person クラスのメンバー変数です。

3. コンストラクタの参照

これは super と一緒に説明します。下記を参照してください。


super

superは、自分自身のスーパー(親)クラスオブジェクトを指すポインタと理解できます。そして、このスーパークラスは、自分に最も近い親クラスを指します。

superにも3つの使い方がある:

1. 通常の直接参照

this と同様に、super は現在のオブジェクトの親クラスを指すことに相当し、これにより次のように使えます。super.xxx親クラスのメンバーを参照するために使う。

2. サブクラスのメンバー変数またはメソッドが親クラスのメンバー変数またはメソッドと同じ名前の場合

实例

class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Shanghai"; super.value(); //親クラスのメソッドの呼び出し System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } }

运行结果:

Shanghai
China

見てわかるように、ここでは親クラスのメソッドも呼び出し、親クラスの変数も呼び出しています。親クラスのメソッド value() を呼び出さず、親クラスの変数 name だけを呼び出す場合、親クラスの name の値はデフォルト値の null になります。

3. コンストラクタの参照

  • super(参数):親クラス内のいずれかのコンストラクタを呼び出します(コンストラクタの最初の文であるべきです)。
  • this(参数):自クラス内の別の形式のコンストラクタを呼び出します(コンストラクタの最初の文であるべきです)。

实例

class Person { public static void prt(String s) { System.out.println(s); } Person() { prt("父类·无参数构造方法:"+"A Person."); }//构造方法(1) Person(String name) { prt("親クラス・引数を1つ取るコンストラクタ:"+"A person's name is " + name); }//构造方法(2) } public class Chinese extends Person { Chinese() { super(); //调用父类构造方法(1) prt("子类·调用父类"无参数构造方法":"+"A chinese coder."); } Chinese(String name) { super(name);//親クラスの同じ仮引数を持つコンストラクタを呼び出す(2) prt("サブクラスが親クラスの「パラメータを1つ含むコンストラクタ」を呼び出す:"+"his name is " + name); } Chinese(String name, int age) { this(name);//同じ仮引数を持つコンストラクタを呼び出す(3) prt("サブクラス:同じ仮引数を持つサブクラスのコンストラクタを呼び出します:his age is" + age); } public static void main(String[] args) { Chinese cn = new Chinese(); cn = new Chinese("codersai"); cn = new Chinese("codersai", 18); } }

运行结果:

父类·无参数构造方法: A Person.
子类·调用父类”无参数构造方法“: A chinese coder.
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18

この例からわかるように、super と this を使ってそれぞれ親クラスのコンストラクタメソッドと自クラス内の他の形式のコンストラクタメソッドを呼び出すことができます。

例では、Chinese クラスの3番目のコンストラクタメソッドは自クラスの2番目のコンストラクタメソッドを呼び出しており、2番目のコンストラクタメソッドは親クラスを呼び出しているため、最初に親クラスのコンストラクタメソッドを呼び出し、次に自クラスの2番目を呼び出し、最後に3番目のコンストラクタメソッドをオーバーライドします。


superとthisの相違点と共通点

  • super(パラメータ):基底クラス内のいずれかのコンストラクタを呼び出します(コンストラクタの最初の文であるべきです)
  • this(パラメータ):自クラス内の別の形式のコンストラクタを呼び出します(コンストラクタの最初の文であるべきです)
  • super:これは現在のオブジェクトの直接の親クラス内のメンバーを参照します(直接の親クラス内で隠されている親クラスのメンバーデータや関数にアクセスするために使用します。基底クラスと派生クラスに同じメンバー定義がある場合、例:super.変数名 super.メンバー関数名(実引数)) this:これは現在のオブジェクト名を表します(プログラム内で曖昧さが生じやすい場所では、this を使って現在のオブジェクトを指し示す必要があります。関数の仮引数とクラスのメンバーデータが同名の場合は、this を使ってメンバー変数名を指し示す必要があります)
  • super() の呼び出しはサブクラスのコンストラクタメソッドの最初の行に書かなければならず、そうでないとコンパイルに通りません。各サブクラスのコンストラクタメソッドの最初の文は、暗黙的に super() を呼び出しています。親クラスにこの形式のコンストラクタがない場合、コンパイル時にエラーになります。
  • super() と this() は似ていますが、違いは、super() はサブクラスから親クラスのコンストラクタメソッドを呼び出し、this() は同じクラス内で他のメソッドを呼び出します。
  • super() と this() はどちらもコンストラクタメソッド内の最初の行に置く必要があります。
  • this を使って1つのコンストラクタを呼び出すことはできますが、2つを呼び出すことはできません。
  • this と super は同じコンストラクタ内に同時に出現することはできません。なぜなら、this は必ず他のコンストラクタを呼び出し、他のコンストラクタにも必ず super 文が存在するからです。そのため、同じコンストラクタ内に同じ文が存在すると、文の意味が失われ、コンパイラも通過させません。
  • this() と super() はどちらもオブジェクトを指すため、static 環境で使用することはできません。具体的には:static 変数、static メソッド、static 文ブロックです。
  • 本質的には、this はこのオブジェクトを指すポインタであり、一方 super は Java のキーワードです。

原文链接:https://www.cnblogs.com/hasse/p/5023392.html