更改构造函数参数运行时
Change constructor arguments runtime
你好,我不知道如何实际寻找这个,但我很好奇,你能根据你在其构造函数中提供的参数更改对象吗?就像你有一个对象库,它有一个构造函数 public Library(Map books) 之类的。如果我创建 Map...new Hashmap,将 5 个键值放入其中,然后将该映射提供给 Library 的构造函数,Library 对象将具有一个包含 5 个键值的哈希图。如果我在 hashmap 中再插入 2 个键值会发生什么?构建的 Library 对象会在其映射中突然有 7 个键值还是仍然只有最初的 5 个?
是的,会的。例如:
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 不是将对象本身传递给构造函数,而是传递对此对象的引用。这意味着来自 main 方法的 books map 和来自 Library 的 books map 实际上是一个对象。
如果您不希望从图书馆外部更改图书馆书籍 class,您可以根据构造函数输入创建新对象。谎言:
public Library(Map<String, String> books) {
this.books = new HashMap(books);
}
这取决于构造函数的作用。如果构造函数只是将 Map 存储在一个实例变量中:
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 本书。
你好,我不知道如何实际寻找这个,但我很好奇,你能根据你在其构造函数中提供的参数更改对象吗?就像你有一个对象库,它有一个构造函数 public Library(Map books) 之类的。如果我创建 Map...new Hashmap,将 5 个键值放入其中,然后将该映射提供给 Library 的构造函数,Library 对象将具有一个包含 5 个键值的哈希图。如果我在 hashmap 中再插入 2 个键值会发生什么?构建的 Library 对象会在其映射中突然有 7 个键值还是仍然只有最初的 5 个?
是的,会的。例如:
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 不是将对象本身传递给构造函数,而是传递对此对象的引用。这意味着来自 main 方法的 books map 和来自 Library 的 books map 实际上是一个对象。 如果您不希望从图书馆外部更改图书馆书籍 class,您可以根据构造函数输入创建新对象。谎言:
public Library(Map<String, String> books) {
this.books = new HashMap(books);
}
这取决于构造函数的作用。如果构造函数只是将 Map 存储在一个实例变量中:
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 本书。