2017-03-12 14 views
-4

参照変数名を取得します。これは正常に動作します Javaでオブジェクトがそのメソッドを呼び出すときに、実行メソッドの "Reference Variable"名が必要です

MyClass c1=new MyClass("A0001"); 
    c1.myMethod(c1); 
    System.out.println(c1.Persons.get(0).Name); // output is: A0001_1 

クラスは次のとおりです。

class MyClass{ 
    public List<Person> Persons = new ArrayList<Person>(); 
    public String name=""; 
    MyClass(String name){ 
     this.name=name; 
    } 
    void myMethod(MyClass c){ 
     Persons.add(new Person(c)); 
    } 
} 

class Person{ 
    public static int Num=0; 
    public String Name=""; 
    Person(MyClass c){ 
     Num++; 
     this.Name=c.name+"_"+Num; 
    } 
} 

が、私はそれは私がに置くことができるか、この

MyClass c1=new MyClass("A0001"); 
    c1.myMethod(); 
    System.out.println(c1.Persons.get(0).Name); 

class MyClass{ 
    public List<Person> Persons = new ArrayList<Person>(); 
    public String name=""; 
    MyClass(String name){ 
     this.name=name; 
    } 
    void myMethod(this){ 
     // which Reference Variable calls this method? 
     System.out.println("name of the Reference Variable="+???); 
     Persons.add(new Person(this)); 
    } 

のようになりたいです?
プログラムで「c1」をどのように表示できますか?

+3

ヒントで答えを確認:あなたは、私たちはあなたを助けるために私たちの時間を過ごしたいです。だから、できるだけ簡単にするために必要な時間を少し費やしてください。 **プレビュー**機能を使用して、すべての**コードが適切に書式設定/インデントされていることを確認してください。それを超えて:それはPersonとPerson1という2つのクラスを持つことは本当に悪い考えです。もう1つは何ですか? 2つのクラスの違いは何ですか?また、フィールド名は小文字で始まります。 'Person'対' Person'を使うことは明らかに間違っているようです。 – GhostCat

+3

あなたがここで尋ねていることはまったく明らかではありません。そしてあなたの編集は**誰かがあなたのためにした素敵な書式設定です** undid **。もう一度:プレビューエリアがあります。これを使って。 –

+0

ありがとうございます。 – Ahmita

答えて

2

パラメータと同じオブジェクトを独自のメソッドに渡す理由はありません。

また、Personオブジェクトを作成するためのパラメータと同じクラスの別のオブジェクトを受け入れるメソッドを作成する理由はありません。

のでごPersonオブジェクトは、常に、MyClassのオブジェクトが作成され、正確なコンストラクタパラメータとしてそのMyClassのオブジェクトが必要な場合は、次の操作を行います。

void myMethod(){ 
    Persons.add(new Person(this)); 
} 
+0

ありがとうございます。あなたが正しいです。 – Ahmita

1

私はあなたの必要性を理解することはよく分かりません。

まず、あなたの質問のタイトルは、あなたがJavaの注入/反射機能を使いたいものになります。 あなたのコードと説明に基づいて、私はあなたがこの複雑さを探しているのか疑問に思います。

第2に、この部分は不明です。あなたはここで何をしようとしているのでしょうか?

void myMethod(){ 
    MyClass c=??? // WHAT DO YOU WANT TO DO ?!!!! 
    Persons.add(new Person(c)); 
} 

Person1クラスのコンストラクタは、人を入れるクラスを決定しますか?

この場合、このようなことができますか?(kindof工場ですか?) MyClassはすべての作成クラスを追跡します。

さらに、あなたのクラスがPersonとPerson1を受け取れるようになっているはずです。

コードはIDEの中央に書かれていますが、いくつかの間違いがまだ残っている可能性があります。 もう一度、これはあなたの投稿の部分的な理解に基づいています。

class Person1 extends Person { 
    Person1() { 
     MyClass c= MyClass.getTheClass("My_Awesome_Class"); 
     this.Name=c.name+"_"+Num; 
     c.addPerson1(this); 
    } 
} 

で:

class MyClass { 
    // keep track of created classes 
    private static HashMap<String,MyClass> classMap = new HashMap<String,MyClass>(); 

    public List<Person> Persons = new ArrayList<Person>(); 
    public String name=""; 

    private MyClass(String name){ 
     this.name=name; 
    } 
    void addNewPerson() { 
     Persons.add(new Person(c)); 
    } 

    void addPerson1(Person1 p) { 

    } 

    // lazy factory 
    public static MyClass getTheClass(String classname) { 
     // class does not exist yet 
     if (! classList.containsKey(classname)) { 
      //create it 
      MyClass theNewClass = new MyClass(classname); 
      classList.put(classname, theNewClass); 
     } 
     return classMap.get(classname); 
    } 
} 

あなたのコードは次のようになります。

// MyClass constructor is no longer directly visible ... 
MyClass c1 = MyClass.getTheClass("A0001"); 
c1.addNewPerson(); 
System.out.println(c1.Persons.get(0).Name); 

Person1 my_pupil = new Person1(); // creates My_Awesome_Class if needed 
MyClass c2 = MyClass.getTheClass("My_Awesome_Class"); 

System.out.println(c2.Persons.get(0).Name); 

EDIT:

いくつかの答えは、あなたが望むかもしれない人のクラスは、そのクラスにvisibityを持っていることを指摘しました。誰かがその部分に答えました:Personコンストラクタの引数としてClassを渡してください。

EDIT2: よく質問が投稿から変更されています...Javaオブジェクトで

+0

申し訳ありませんが私の質問は変更されていません – Ahmita

+0

私はちょうど私の質問を明確にします。 – Ahmita

1

は主にヒープメモリ上に作成されているので、我々はあなたがthis.hashCode();を使用してハッシュコードを得ることができますJavaの
内のオブジェクトの名前を持っていない、これはヒープ内のあなたのオブジェクトのアドレスではありません我々はMyClass c1=new MyClass("A0001");を書くとき、c1class MyClassその基準の対象ではありません:、私たちは、Java
でオブジェクトのアドレスを取得していないので、あなたはthis.getClass().getName

注意を使用して、オブジェクトのクラス名を取得することができます〜class MyClass

それについての詳細を知るには、以下のlink

+0

ありがとうございます。実際にはMyClassクラスの参照名が必要です。 – Ahmita

+0

'MyClass c1 = new MyClass(" A0001 ");'ここで 'c1'はヒープ上に作成されたオブジェクトの参照名であり、可能であればこの答えにあるリンクをチェックしてください。私たちがMyClassを書くとき、 " –

+0

@Pushkarraj"と書くと、c1 = new MyClass( "A0001");、c1はMyClassクラスのオブジェクトではなく、MyClassクラスへの参照です。 c1はMyClassクラスのインスタンスへの参照です。つまりオブジェクトです。どうぞ、他の人を欺いてはいけません。 – Vadim

関連する問題