2017-12-10 16 views
-1

Javaでドット演算子を使用して非静的フィールドにアクセスできる方法を理解できません。非静的フィールドのJavaドット演算子

私はこれが基本的なJavaだと確信していますが、同じことを許しています。

public class AbstractEntity {  
    @Id 
    @Column(nullable = false,updatable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected long id; 
} 

public class Participant extends AbstractEntity { 
    @Override 
    public boolean equals(Object object){ 
     return Objects.equals(id,((Participant)object).id); 
    } 
} 
+0

idフィールドが保護されていれば、公開getIdメソッドを公開することができます –

+0

ここを見てください - https://stackoverflow.com/questions/2559527/non-static-variable-cannot-be-referenced-from-a- static-context – vinS

+0

あなたは正しいです。これは基本的なJavaです。これは '.'演算子のためのもので、静的フィールドや静的メソッドや非静的メソッド、その他いくつかのものにアクセスすることに加えてです。あなたが何を求めているのか不明です。 – EJP

答えて

1

Ok ....最初に理解すると、明示的に新しいObject()を実行する必要はありません。オブジェクトはスーパークラスであり、これは子ができます親のようになり、その逆になりません。

結論として、Participantクラスの独自のフィールドにアクセスして、それをキャストしようとしています。 p.idこののようにアクセスすることができ、同じが((参加者)オブジェクト)としてキャストされてちょうどこのような何かを...

Participant p; 
p.id 

、同じことを検証するために

を.IDまた、public boolean equals(Object object)には、intが参加者の引数を受け付けるパラメータとしてobjectがあり、objectは参加者の型であるため、オブジェクトから参加者にキャストされています。

あなたのために理にかなったら投票してください。

+0

私は理解しています。 – Terminator

0

非静的フィールドは、あまりにも、あなたのように渡されている「オブジェクト」を使用して、非静的である「ID」をアクセスしているクラスのインスタンスを使用し、あなたのケースでアクセスすることができますパラメータはequals()メソッドに渡しますが、これは完全に問題ありません。

基本的に、あなたの例では、 'object'をParticipantクラスに型キャストし、 '。'を使用してその非静的データメンバーにアクセスしています。オペレータ、これは完璧です。

もう1つの点は、データメンバの場合、ゲッタとセッタにアクセスする必要があります。直接アクセスしないでください。

+0

質問は、どのようにそれが可能ですか?私はクラスの名前だけのインスタンスを作成していません。 – Terminator

+1

@Terminator 'Object object'がインスタンスです。 –

+0

equals()の定義を見ると、オブジェクトはそのオブジェクトにパラメータとして渡されているので、実際のインスタンスに対してequalsメソッドを呼び出すときには、そのインスタンスをequals()のパラメータとして渡す必要があります。比較を行うために。 –