こんにちは私は実際にこれを探す方法はわかりませんが、興味があります。コンストラクタで指定した引数に基づいてオブジェクトを変更できますか?あなたはコンストラクタの公共図書館(地図帳)か何かを持っているオブジェクトライブラリを持っているように。 Map ... new Hashmapを作成し、その中に5つのキー値を入れ、そのマップをLibraryのコンストラクタに渡すと、Libraryオブジェクトは5つのキー値を持つハッシュマップを持ちます。ハッシュマップにさらに2つのキー値を挿入するとどうなりますか?突然構築された図書館オブジェクトには、マップ内に7つのキー値がありますか、それともまだ最初の5つしかありませんか?コンストラクタ引数のランタイムを変更する
0
A
答えて
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);
}
関連する問題
- 1. 1つのコンストラクタ引数を変更するクラスオブジェクトを再作成
- 2. Javaコンストラクタの可変引数
- 3. C++クラスのコンストラクタ引数の数が変更されました
- 4. 2引数のコンストラクタを呼び出す引数のないコンストラクタ
- 5. JavaScriptコンストラクタ引数
- 6. ランタイム値をランタイム値をコンパイルテンプレート引数に変換する複数のパラメータパックの操作
- 7. 可変長引数テンプレートコンストラクタと移動コンストラクタ
- 8. デフォルトのRuby引数を変更する
- 9. ブロックコールバックの引数型を変更する
- 10. "call"オブジェクトの引数を変更する
- 11. ランタイム中にログファイルの名前を数回変更する
- 12. 可変数の引数を持つスカラクラスのコンストラクタ
- 13. Javaで可変数の引数を持つコンストラクタ
- 14. xibのカスタムクラスのランタイム変更
- 15. javafxランタイムでCSSを変更する
- 16. JavaScriptのコンストラクタと引数
- 17. C++配列コンストラクタの引数
- 18. 引数なしのコンストラクタ
- 19. ES6クラスのコンストラクタ引数
- 20. Scalaのパラメトリックフィールドとコンストラクタ引数
- 21. Beautifulsoupコンストラクタとその引数
- 22. テンプレート階層のコンストラクタ引数
- 23. コンストラクタのデフォルト引数 - C++
- 24. ランタイム制約の変更
- 25. CMFCToolBarランタイムの変更方法
- 26. ランタイムappconfig値の変更
- 27. AppBarLayoutカラーのランタイム変更
- 28. emplace()の引数転送はコンストラクタ引数をconstにします
- 29. JMXのランタイム設定JVM引数
- 30. Bashでコマンドライン引数を変更する
オブジェクトの配列を渡しても構いませんが、各要素ランタイムの処理が必要です – Stultuske
Javaの引数は値渡しですが、Objectの場合は値が参照値なので使用できます指示対象を変更するためのものである。あなたの答えには、7つのキーの地図を参照します。 – mhasan
[this](http://ideone.com/4BPRHb)の例を見てください。 – Blobonat