2012-01-31 2 views
9

Javaの場合、次の例のmainメソッドの2行目にあるように、.を使用してクラスのパブリックメンバーにアクセスできます(この例では、私のカプセル化の貧弱な使用を無視します)。は 'です。 Javaのオペレータと見なされるメンバアクセスのための?

public class Test { 
    public static void main(String[] args) { 
     Position p = new Position(0,0); 
     int a = p.x; // example of member access 
    } 
} 

class Position { 
    public int x; 
    public int y; 

    public Position(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

.だけ*~、および!=として考えられている、Javaプログラミング言語の演算子と考える事業者ですか?


編集 - 上記の例の拡張:指摘されているよう

が、Java言語仕様が.セパレータとしないオペレータであると考えているようです。しかし、私は、.がオペレータのように見える動作をしていることを指摘したいと思います。以下に拡張上記の例を考える:

public class Test { 
    public static void main(String[] args) { 
     Position p = new Position(0,0); 
     int a = p . x; // a -> 0 
     int x = 1; 
     int b = p . x + x; // b -> 1 
    } 
} 

class Position { 
    public int x; 
    public int y; 

    public Position(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

いくつかの優先順位は、メンバアクセスを添加する前に評価されるように強制されていることは明らかです。これは直感的に思えます。なぜなら、加算を最初に評価するとしたら、p.2がナンセンスになるからです。それにもかかわらず、.は他のセパレータでは動作しないことが明らかです。

+0

"this"構文を省いてください。それはあなたがクラスを拡張するときには、他の手でスーパーは大丈夫です、Javaの世界では悪い習慣です。 – Tom

+3

@Tom私の例で 'this'の使用を取り除くと、私のパブリックフィールドはインスタンス化されず、実行時エラーが発生します。また、それは特に私の質問にrelaventされていません。 – jbranchaud

+3

@Tomあなたの意見はおそらく、ほとんどの一般的なルールです。私は個人的には、これらのパラメータとフィールドを区別できるように、パラメータのいくつかの新しい名前を考案することよりはるかに優れたセッターとコンストラクタでこれを使用しています。 – Voo

答えて

15

セパレータとし、オペレータとは見なされません。すべての区切り記号と演算子のリストについては、Java Language Specification sections 3.11 and 3.12を参照してください。

+0

私はまだ不確実性があります。ダブル(例えば '1.1')の文脈では、セパレータのように見えますが、メンバアクセスのコンテキストではオペレータのほうが多いようです。 – jbranchaud

+0

@Treebranch - [アクセス制御](http://java.sun.com/docs/books/jls/third_edition/html/names.html#104285)の説明では、JLSは_qualified names_: "a"について説明しています。 "トークンが現れ、タイプのあるパッケージ、タイプ、または式の表示が先行し、その後にパッケージまたはタイプのメンバーの名前を示す識別子が続きます。そこで、オペレータとは区別して句読点(すなわちセパレータ)に似た「トークン」があります。いずれにせよ、「。」の正確な分類は、トークンは、Javaでは演算子オーバーライドが許可されていないため、C++のようにJavaではそれほど重要ではありません。 –

+0

そういう言い方をすると意味があります、説明のためにありがとう! – jbranchaud

関連する問題