2016-09-21 12 views
0

こんにちは私は実際にこれを探す方法はわかりませんが、興味があります。コンストラクタで指定した引数に基づいてオブジェクトを変更できますか?あなたはコンストラクタの公共図書館(地図帳)か何かを持っているオブジェクトライブラリを持っているように。 Map ... new Hashmapを作成し、その中に5つのキー値を入れ、そのマップをLibraryのコンストラクタに渡すと、Libraryオブジェクトは5つのキー値を持つハッシュマップを持ちます。ハッシュマップにさらに2つのキー値を挿入するとどうなりますか?突然構築された図書館オブジェクトには、マップ内に7つのキー値がありますか、それともまだ最初の5つしかありませんか?コンストラクタ引数のランタイムを変更する

+0

オブジェクトの配列を渡しても構いませんが、各要素ランタイムの処理が必要です – Stultuske

+0

Javaの引数は値渡しですが、Objectの場合は値が参照値なので使用できます指示対象を変更するためのものである。あなたの答えには、7つのキーの地図を参照します。 – mhasan

+0

[this](http://ideone.com/4BPRHb)の例を見てください。 – Blobonat

答えて

1

コンストラクタが何をするかによって異なります。コンストラクタは単にインスタンス変数で地図を格納した場合:

public class Library { 
    private final Map<String, String> books; 

    public Library(Map<String, String> books) { 
     this.books = books; 
    } 

    public int size() { 
     return books.size(); 
    } 

    public static void main(String[] args) { 
     Map<String, String> myBooks = new HashMap<String,String>(); 
     myBooks.put("Jonathan Swift", "Gullivers Travels"); 
     myBooks.put("Robert Louis Stevenson", "Treasure Island"); 
     myBooks.put("William Shakespeare", "Hamlet"); 
     myBooks.put("J R R Tolkein", "The Hobbit"); 
     myBooks.put("Mary Shelley", "Frankenstein"); 
     Library library = new Library(myBooks); 
     myBooks.put("J K Rowling", "Harry Potter and the Philosophers stone"); 
     System.out.println("Library contains" + library.size() + " books"); 
    } 
} 

は、ライブラリは、渡されたマップへの参照が含まれ、それはそのマップの内容の変更が表示されます。上記のコードは、図書館に6冊の本があることを印刷します。一方

コンストラクタは、マップのコピーを作成した場合:

public class Library { 
    private final Map<String, String> books; 

    public Library(Map<String, String> books) { 
     this.books = new HashMap<String, String>(books); 
    } 

    public int size() { 
     return books.size(); 
    } 

    public static void main(String[] args) { 
     Map<String, String> myBooks = new HashMap<String,String>(); 
     myBooks.put("Jonathan Swift", "Gullivers Travels"); 
     myBooks.put("Robert Louis Stevenson", "Treasure Island"); 
     myBooks.put("William Shakespeare", "Hamlet"); 
     myBooks.put("J R R Tolkein", "The Hobbit"); 
     myBooks.put("Mary Shelley", "Frankenstein"); 
     Library library = new Library(myBooks); 
     myBooks.put("J K Rowling", "Harry Potter and the Philosophers stone"); 
     System.out.println("Library contains" + library.size() + " books"); 
    } 
} 

[ライブラリは、マップの独自のコピーを持っており、元のマップへの変更は表示されませんので、上記のコード図書館に5冊の本があることを印刷する必要があります。

0

はい、そうです。例えば:

import java.util.Map; 
import java.util.HashMap; 

public class HelloWorld{ 

public static void main(String []args){ 
    Map<String, String> books = new HashMap(); 
    books.put("Author1", "Book1"); 
    books.put("Author2", "Book1"); 
    Library l1 = new Library(books); 
    books.put("Author3", "Book1"); 
    System.out.println(l1.toString()); 
} 
} 

class Library { 
private Map<String, String> books; 

public Library(Map<String, String> books) { 
    this.books = books; 
} 

@Override 
public String toString() { 
    return books.toString(); 
} 

}

出力は次のようになります {Author3 = BOOK1、Author2 = BOOK1、Author1 = BOOK1}

Javaはコンストラクタにオブジェクト自体ではなく渡すためでありますこのオブジェクトへの参照です。これは、メインメソッドからのブックマップを意味し、ライブラリからのブックマップは、実際には1つのオブジェクトです。 ライブラリブックがライブラリクラスの外側から変更されないようにするには、コンストラクタの入力に基づいて新しいオブジェクトを作成できます。これは:

public Library(Map<String, String> books) { 
    this.books = new HashMap(books); 
} 
関連する問題