とmethod()
(性能の違いを含む)を呼び出す間に違いはありますか?Javaでは、this.method()とmethod()の違いは何ですか?
答えて
重要なのは、OuterClass.this.method()
などを使用している場合のみです。
class OuterClass {
void method() { }
class InnerClass {
void method() {
OuterClass.this.method(); // not the same as method().
}
}
}
これらの構成要素には全く違いはなく、生成されるバイトコードはまったく同じで、パフォーマンスには影響しません。 this
は、明示的に定義されていないとコンパイル時に解決されます。
明示的なthis
を使用する唯一の理由は、可読性です。this
は、これが現在のオブジェクトのインスタンスメソッドであることを示唆しているため、読みやすくなっていることがあります。
method()
が静的な場合は、this
を使用することはお勧めできません。
private static void method() {
}
private void foo() {
this.method(); //generates warning in my IDE for a reason
}
この場合も、パフォーマンスには影響しません。
実際の違いはありません。少なくとも、パフォーマンスには影響ありません。私は "これ"を書くのが好きではありません - IDEは通常これを呼び出すことができますが、メソッド/フィールド/ ...へのアクセスがすべて "this"で始まると読みにくいと思います。しかし、それは本当に個人的な好みの問題です。
this.method()を使用すると、静的関数または別のオブジェクトに属する関数とは対照的に、クラスのインスタンスに関連付けられた関数が呼び出されます。
クラス内のすべてのメンバー変数に "m_"を付けるのが好きなC++開発者の精神です。それは所有権を明白にします。私はそれが気に入っている傾向がありますが、色やフォントを使ってそのようなことを明確にするIDEを使用しているときは、それほど重要ではありません。
"*他のオブジェクトに属するもの*"まあ、他のオブジェクトの接頭辞は必須ですか? "*静的関数とは対照的*"この区別は重要ですか? – PhiLho
方法には違いはありませんが、フィールドとの違いがあります。何の違いはコマンドライン上でjavap -c ClassName
を呼び出すことによって見ることができますが存在しないこと
private String someObject = "some value";
public String someMethod(String someObject) {
//this.someObject refers to the field while
//someObject refers to the parameter
}
:このコードを考えてみましょう。たとえば :
public class This {
private void method() {
}
public void noThis() {
method();
}
public void useThis() {
this.method();
}
}
は、次の逆アセンブルの出力を生成します。
Compiled from "This.java"
public class This extends java.lang.Object{
public This();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public void noThis();
Code:
0: aload_0
1: invokespecial #2; //Method method:()V
4: return
public void useThis();
Code:
0: aload_0
1: invokespecial #2; //Method method:()V
4: return
}
唯一の違いは、コンパイル時に暗黙の 'this 'を見つけ出すには数マイクロ秒です。 – TWiStErRob
読みやすさよりも他のすべての違いはありません。それは読者にそれをより明確にします。
読みやすさは目に見えます:「これ」の情報は暗黙的なので重複しているので、より騒々しいと感じます。それは初心者を助けるかもしれない、(多くの)より経験豊富なコーダーのために迷惑である。 – PhiLho
コンストラクタでthis.variableを実行しようとしましたか?
理論上、C++では、オブジェクトがまだ作成されていないので、これはありません。私はJavaの場合についてはわかりません。
'this.foo = foo;'は同じ名前のパラメータからフィールド(メンバ変数)を初期化する非常に一般的なパターンなので、Javaで動作します。 – PhiLho
および/またはthis.myVar
を使用するか、または違いがない方法を使用しないでください。違いがあるかもしれませんが、一貫性があります。私はそれがコード全体に振りかけるのを見ます、時々私はthis.m_myClassVar
を参照してください。
は個人的に私は私のメソッドの引数に私のクラスは、単純なアンダースコアでvarsのプレフィックスと末尾を置くことを好むアンダースコア:
public MyClass
{
private int _myInt;
public void myMethod(final int myInt_, final int fooFactor_)
{
_myInt = myInt_ * fooFactor_;
}
}
ほとんどのIDEは、私はこれを防ぐために傾向が見つけた、であることが明確になりますが、誤った割り当てを行い、コードの意図をより明確にし、IMOを読みやすくします。
_thisInstance.myMethod()
(_thisInstance
は外部クラスへの参照です)または_thisInstance._myVar
を内部クラス/リスナー/スレッド/ etcに使用します。どこのクラスでどのメソッドを呼び出しているのか、クラスインスタンスへの参照が必要なのかを明確にする必要があります。
変数名にアンダースコアを使用すると、定数でない変数のJava命名規則に反します。 –
- 1. Javaではargsとargghとargvの違いは何ですか?
- 2. **/*。javaと* .javaの違いは何ですか?
- 3. Mule Java TransformerとJava Componentの違いは何ですか
- 4. gdata-java-clientとgoogle-api-java-clientの違いは何ですか?
- 5. Java SEとJava EEの主な違いは何ですか?
- 6. Java WebアプリケーションとJava Enterprise Applicationの違いは何ですか?
- 7. Java generics - 違いは何ですか?
- 8. JavaでThread.yield()とThread.sleep(0)の違いは何ですか?
- 9. !=と=の違いは何ですか? Javaで?
- 10. インタフェースについてGoとJavaの違いは何ですか?
- 11. javaのこのスーパーキーワードとの違いは何ですか?
- 12. JavaのPattern.compile( "\\\" ")とPattern.compile(" \ "")のマッチングの違いは何ですか?
- 13. Haskellの型コンストラクタとjavaジェネリック型の違いは何ですか?
- 14. JavaのFloatとfloatの違いは何ですか?
- 15. JavaのFileReaderとFileInputStreamの違いは何ですか?
- 16. Eclipseの "Java Project"オプションと "Project"オプションの違いは何ですか?
- 17. JavaとC++のイテレータの違いは何ですか?
- 18. JavaのaddShutDownHookとシグナルハンドラの違いは何ですか?
- 19. javaのthis.variableとthis.getVariable()の違いは何ですか?
- 20. forループのString []とStringの違いは何ですか?(Java)
- 21. .NET/JavaとRubyのドメインモデリングの主な違いは何ですか?
- 22. Javaのリファレンスとオブジェクトの違いは何ですか?
- 23. Eclipseの "Java EE"と "rcp"ディストリビューションの違いは何ですか?
- 24. Javaのcharリテラル '\ n'と '\ r'の違いは何ですか?
- 25. Javaのpublic intとintの違いは何ですか?
- 26. Javaの式とステートメントの違いは何ですか?
- 27. javaとphpのタイムスタンプの違いは何ですか?
- 28. プロジェクトとJavaのファイルの違いは何ですか?
- 29. Java 9の--add-exportsと--add-opensの違いは何ですか?
- 30. JavaのThread.interrupt()とThread.currentThread.interrupt()の違いは何ですか?
しかし、OuterClass.method()はメソッドがstaticの場合と同じです –
厳密に言えば、IMHOでは、OuterClass.this.method()をmethod()と比較することはできません。イン/アウト。 –
この特別な例Peterをお越しいただきありがとうございます。 –