通常、私this
はコンストラクタでのみ使用します。
this.something
グローバル変数と同じ名前を持っている場合、(を使用して)パラメーター変数を識別するために使用されることを理解しています。
ただし、this
Javaの本当の意味が何であるか、this
ドット(.
)なしで使用するとどうなるかはわかりません。
通常、私this
はコンストラクタでのみ使用します。
this.something
グローバル変数と同じ名前を持っている場合、(を使用して)パラメーター変数を識別するために使用されることを理解しています。
ただし、this
Javaの本当の意味が何であるか、this
ドット(.
)なしで使用するとどうなるかはわかりません。
回答:
this
現在のオブジェクトを参照します。
各非静的メソッドは、オブジェクトのコンテキストで実行されます。したがって、次のようなクラスがある場合:
public class MyThisTest {
private int a;
public MyThisTest() {
this(42); // calls the other constructor
}
public MyThisTest(int a) {
this.a = a; // assigns the value of the parameter a to the field of the same name
}
public void frobnicate() {
int a = 1;
System.out.println(a); // refers to the local variable a
System.out.println(this.a); // refers to the field a
System.out.println(this); // refers to this entire object
}
public String toString() {
return "MyThisTest a=" + a; // refers to the field a
}
}
その後の呼び出しfrobnicate()
でnew MyThisTest()
印刷します
1 42 MyThisTest a = 42
だからあなたは複数のもののためにそれを効果的に使用します:
main
メソッドが必要であるというエラーが表示されます。mainメソッドを追加する場合は、そこから呼び出す必要があります。また、main内でfrobnicate()を呼び出そうとすると、静的参照内から非静的参照を呼び出すことはできません。からstaticを削除するmain
と、メインメソッドが見つからないというエラーが再び返されます。説明してください。
this.
機能するかについて基本的なことを私は見逃している。私の理解では、それがされてthis.
起動せずに呼ばれて存在しているメソッドや変数の別のバージョンを考慮して、あなたはクラスのインスタンス化されたバージョンに固有のメソッドや変数を呼び出すことができますthis.
シンプルで呼ばれTest.class
、私は二つの方法がありますpublic static void main()
し、public Test()
I main
は静的であり、コンストラクタは静的にできないため、メソッド間で情報を渡すことができません。新しい質問として投稿する必要がありますか?
static
するということは、それを呼び出すためにクラスのインスタンスを必要とせず、そのthis
内部にアクセスできないことを意味します。
以下はここからのコピー&ペーストですが、this
キーワードのさまざまな使用法を非常によく説明しています。
定義:Javaのthis
キーワードは、それが使用されているメソッドの現在のインスタンスを参照するために使用されます。
これを使用する方法は次のとおりです。
静的変数またはローカル変数の代わりにインスタンス変数が使用されることを具体的に示すため。あれは、
private String javaFAQ;
void methodName(String javaFAQ) {
this.javaFAQ = javaFAQ;
}
ここではインスタンス変数を指します。ここでは、ローカル変数の優先順位が高くなっています。したがって、がない場合はthis
ローカル変数を示します。パラメータの名前であるローカル変数がインスタンス変数と同じでない場合、this
使用されるかどうかに関係なく、インスタンス変数を示します。
This
コンストラクタを参照するために使用されます
public JavaQuestions(String javapapers) {
this(javapapers, true);
}
これにより、2つのパラメーターを持つ同じjavaクラスのコンストラクターが呼び出されます。
This
現在のJavaインスタンスをパラメーターとして渡すために使用されます
obj.itIsMe(this);
上記と同様に、これは現在のインスタンスを返すためにも使用できます
CurrentClassName startMethod() {
return this;
}
注:これは、上記の2つのポイントの内部クラスで使用されている場合、望ましくない結果になる可能性があります。これは、外部インスタンスではなく内部クラスを参照するためです。
This
現在のクラスのハンドルを取得するために使用できます
Class className = this.getClass(); // this methodology is preferable in java
これは
Class className = ABC.class; // here ABC refers to the class name and you need to know that!
いつものように、this
はそのインスタンスに関連付けられており、これは静的メソッドでは機能しません。
完全にthis
するために、外側のオブジェクトを参照するためにも使用できます
class Outer {
class Inner {
void foo() {
Outer o = Outer.this;
}
}
}
this
私が探していたものです!;)
super
特定のオブジェクトの現在のインスタンスを参照するため、次のように記述できます
public Object getMe() {
return this;
}
の一般的な使用例this
は、シャドウイングを防ぐことです。次の例を見てください。
public class Person {
private final String name;
public Person(String name) {
// how would we initialize the field using parameter?
// we can't do: name = name;
}
}
上記の例では、パラメーターの値を使用してフィールドメンバーを割り当てます。それらは同じ名前を共有するため、フィールドとパラメーターを区別する方法が必要です。this
フィールドを含む、このインスタンスのメンバーにアクセスできます。
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
}
Swing ActionListener
では、コンポーネントのActionListenerとして現在のインスタンス(つまり「this」)を実装および追加するクラスを作成することはかなり一般的です。
public class MyDialog extends JDialog implements ActionListener
{
public MyDialog()
{
JButton myButton = new JButton("Hello");
myButton.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
System.out.println("Hurdy Gurdy!");
}
}
programming.guideの記事を引用:
this
Javaプログラムには2つの用途があります。
この場合の構文は通常、次のようになります。
this.someVariable = someVariable;
このタイプの使用法はここで説明されています:'this'リファレンス(例付き)
この場合の構文は通常、次のようになります。
MyClass() {
this(DEFAULT_VALUE); // delegate to other constructor
}
MyClass(int value) {
// ...
}
このタイプの使用法は次のとおりです:this(…)コンストラクター呼び出し(例を含む)
メソッドが呼び出されるインスタンスを指します
class A {
public boolean is(Object o) {
return o == this;
}
}
A someA = new A();
A anotherA = new A();
someA.is(someA); // returns true
someA.is(anotherA); // returns false
このキーワードは、(そう、標準のJavaコードを期待してはいけない、ちょうどexampple)コードの下に検討し、たとえば、ブロックの現在の変数を参照するために使用されます。
Public class test{
test(int a) {
this.a=a;
}
Void print(){
System.out.println(a);
}
Public static void main(String args[]){
test s=new test(2);
s.print();
}
}
それでおしまい。出力は「2」になります。thisキーワードを使用しなかった場合、出力は0になります。
オブジェクトには、クラスから派生したメソッドと属性(変数)があり、特定のオブジェクトに属するメソッドと変数を指定するために、this
予約語が使用されます。インスタンス変数の場合、暗黙的パラメーターと明示的パラメーターの違いを理解することが重要です。オブジェクトのfillTank
呼び出しを見てくださいaudi
。
Car audi= new Car();
audi.fillTank(5); // 5 is the explicit parameter and the car object is the implicit parameter
括弧内の値は暗黙的なパラメーターであり、オブジェクト自体は明示的なパラメーターです。明示的なパラメーターを持たないfillTank
メソッドは、暗黙的なパラメーターを使用し、メソッドには明示的パラメーターと暗黙的パラメーターの両方があります。
クラスのfillTank
メソッドを詳しく見てみましょうCar
public class Car()
{
private double tank;
public Car()
{
tank = 0;
}
public void fillTank(double gallons)
{
tank = tank + gallons;
}
}
このクラスには、インスタンス変数「タンク」があります。tankインスタンス変数を使用する多くのオブジェクトが存在する可能性があります。インスタンス変数「tank」が特定のオブジェクトに使用されることを指定するために、先ほど作成した「audi」オブジェクトでは、this
予約済みキーワードを使用します。以下のためのインスタンス変数の「この」の使用方法は、インスタンス変数は、「タンク」我々の場合には、暗黙のパラメータのインスタンス変数であることを示しています。
this
予約語はJavaコンパイラーによって自動的に追加されるため、追加する必要はありません。これは好みの問題です。this
それらはjava(構文)の規則であるため、ドット(。)なしでは使用できません。
要約すれば。
this
、インスタンス変数が暗黙的パラメーターに属しているか、暗黙的パラメーターのインスタンス変数であることを示します。this
ドット(。)なしでは使用できません。これは構文的に無効ですthis
同じ名前のローカル変数とグローバル変数を区別するためにも使用できますthis
予約語は、特定のオブジェクトに属するメソッドを示すために、方法に適用されます。インスタンス変数は、作成するすべてのオブジェクトに共通です。たとえば、2つのインスタンス変数があるとします
class ExpThisKeyWord{
int x;
int y;
public void setMyInstanceValues(int a, int b) {
x= a;
y=b;
System.out.println("x is ="+x);
System.out.println("y is ="+y);
}
}
class Demo{
public static void main(String[] args){
ExpThisKeyWord obj1 = new ExpThisKeyWord();
ExpThisKeyWord obj2 = new ExpThisKeyWord();
ExpThisKeyWord obj3 = new ExpThisKeyWord();
obj1.setMyInstanceValues(1, 2);
obj2.setMyInstanceValues(11, 22);
obj3.setMyInstanceValues(111, 222);
}
}
上記のコードに気付いた場合は、3つのオブジェクトを開始し、3つのオブジェクトがSetMyInstanceValuesメソッドを呼び出しています。JVMはすべてのオブジェクトに値を正しく割り当てると思いますか?トリックがあります。JVMはこのコードを上記のように表示しません。その代わりに、以下のコードのように表示されます。
public void setMyInstanceValues(int a, int b) {
this.x= a; //Answer: this keyword denotes the current object that is handled by JVM.
this.y=b;
System.out.println("x is ="+x);
System.out.println("y is ="+y);
}
(私はイムが遅いのを知っていますが、あなたが私を見たことがない卑劣なボイであるイム)
ほとんどのオブジェクト指向プログラミング言語の thisキーワードは、すべてではないにしても、そのクラスの現在のオブジェクトインスタンスへの参照であることを意味します。これは基本的に、メソッドの外部から名前でそのオブジェクトを呼び出すのと同じです。それはおそらく意味をなさないので、詳しく説明します。
クラスの外で、オブジェクトのインスタンス内で何かを呼び出すために、たとえば、objectというオブジェクトがあり、使用する必要があるフィールドを取得したいとします
object.field
たとえば、クラス内からobject.fieldにアクセスしようとしているとします。たとえば、コンストラクタを使用するとします。
this.field
このキーワードは、本質的に、クラスの内部で呼び出されたときにオブジェクト名キーワードを置き換えます。同じ名前の2つの変数があり、その1つがクラスのフィールドであり、もう1つがメソッド内の変数である場合を除いて、通常、これを行う理由はそれほど多くありません。 。たとえば、これを持っている場合:(ええ、それを取得しますか?これ?Hehe ....私だけですか?OK :(私は今出発します)
public String Name;
//Constructor for {object} class
public object(String Name){
Name = Name;
}
これはいくつかの問題を引き起こし、コンパイラーはコンストラクターのパラメーターで定義されたName変数とクラスのフィールド宣言内のName変数の違いを認識できないため、代わりにNameパラメーターを割り当てます。 ..有益なことを何も行わず、文字通り目的を持たないNameパラメーターの値。これは、ほとんどの新しいプログラムが行う一般的な問題であり、私もその犠牲者でした。とにかく、このパラメーターを定義する正しい方法は、以下を使用することです。
public String Name;
//Constructor for {object} class
public object(String Name){
this.Name = Name;
}
このようにして、コンパイラーは、割り当てようとしているName変数がクラスの一部であり、メソッドの一部ではないことを認識し、正しく割り当てます。つまり、コンストラクターに入力したものにNameフィールドを割り当てます。
要約すると、基本的には、作業中のクラスのオブジェクトインスタンスのフィールドを参照するため、キーワード「this」、つまりthisオブジェクトまたはこのインスタンスを意味します。単に名前を使用するのではなく、クラスのフィールドを呼び出すときにこれを使用することをお勧めします。これは、コンパイラーがその上で実行されるときに見つけるのが難しいバグを回避するためです。
簡単なグーグル検索はこの結果をもたらしました:http://xahlee.org/java-a-day/this.html
ほとんどの "this"キーワードは、現在のオブジェクト(それ自体)への参照です。
this
現在のオブジェクトへの参照です:http : //download.oracle.com/javase/tutorial/java/javaOO/thiskey.html
これは、現在「入っている」オブジェクトを指します。つまり、これは受信オブジェクトを指します。これを使用して、参照している変数を明確にします。Java_whitepaperページ:37
class Point extends Object
{
public double x;
public double y;
Point()
{
x = 0.0;
y = 0.0;
}
Point(double x, double y)
{
this.x = x;
this.y = y;
}
}
上記のコード例では、this.x / this.yは現在のクラスであるPointクラスのx変数とy変数を参照しています。
このキーワードからわかったことを共有したいと思います。このキーワードには、Javaで次の6つの使用法があります。
1.現在のクラス変数を参照するために使用できます。 コードで理解しましょう。*
以下の例でこのキーワードを使用しない場合の問題を理解しましょう。
class Employee{
int id_no;
String name;
float salary;
Student(int id_no,String name,float salary){
id_no = id_no;
name=name;
salary = salary;
}
void display(){System.out.println(id_no +" "+name+" "+ salary);}
}
class TestThis1{
public static void main(String args[]){
Employee s1=new Employee(111,"ankit",5000f);
Employee s2=new Employee(112,"sumit",6000f);
s1.display();
s2.display();
}}
出力:-
0 null 0.0
0 null 0.0
上記の例では、パラメーター(仮引数)とインスタンス変数は同じです。したがって、このキーワードを使用して、ローカル変数とインスタンス変数を区別しています。
class Employee{
int id_no;
String name;
float salary;
Student(int id_no,String name,float salary){
this.id_no = id_no;
this.name=name;
this.salary = salary;
}
void display(){System.out.println(id_no +" "+name+" "+ salary);}
}
class TestThis1{
public static void main(String args[]){
Employee s1=new Employee(111,"ankit",5000f);
Employee s2=new Employee(112,"sumit",6000f);
s1.display();
s2.display();
}}
出力:
111 ankit 5000
112 sumit 6000
2.現在のクラスメソッドを呼び出す。
class A{
void m(){System.out.println("hello Mandy");}
void n(){
System.out.println("hello Natasha");
//m();//same as this.m()
this.m();
}
}
class TestThis4{
public static void main(String args[]){
A a=new A();
a.n();
}}
出力:
hello Natasha
hello Mandy
3.現在のクラスコンストラクターを呼び出す。コンストラクタの連鎖に使用されます。
class A{
A(){System.out.println("hello ABCD");}
A(int x){
this();
System.out.println(x);
}
}
class TestThis5{
public static void main(String args[]){
A a=new A(10);
}}
出力:
hello ABCD
10
4.メソッドの引数として渡します。
class S2{
void m(S2 obj){
System.out.println("The method is invoked");
}
void p(){
m(this);
}
public static void main(String args[]){
S2 s1 = new S2();
s1.p();
}
}
出力:
The method is invoked
5.コンストラクター呼び出しで引数として渡す
class B{
A4 obj;
B(A4 obj){
this.obj=obj;
}
void display(){
System.out.println(obj.data);//using data member of A4 class
}
}
class A4{
int data=10;
A4(){
B b=new B(this);
b.display();
}
public static void main(String args[]){
A4 a=new A4();
}
}
出力:-
10
6.現在のクラスインスタンスを返す
class A{
A getA(){
return this;
}
void msg(){System.out.println("Hello");}
}
class Test1{
public static void main(String args[]){
new A().getA().msg();
}
}
出力:-
Hello
また、このキーワードは構文が無効であるため、。(ドット)なしでは使用できません。