当 class 的多个实例被生成时,一个方法会生成多少个副本?
How many copies of a method are generated when multiple instances of a class are made?
例如,我生成一个 class 这样的:
public class Test {
public void sayHello (String name) {
System.out.println("Hello, " + name);
}
}
当我像这样创建多个实例时:
Test t1 = new Test();
Test t2 = new Test();
那么对象 t1 和 t2 是共享相同的方法 sayHello
,还是它们都有自己的 sayHello
方法?
方法属于一个class的所有对象,不管你实例化了多少个对象。 class 的所有方法的代码放在内存中的一个共享位置,class 的所有实例为每个方法引用相同的代码。
这种共享是可能的,因为方法代码不会因实例而异。
实际情况下,如果想共享同一个方法sayHello
,可以声明为静态方法
public static void sayHello (String name) {
System.out.println("Hello, " + name);
}
然后Test.sayHello()
(推荐),t1.sayHello()
和t2.sayHello()
效果一样。
否则,如果 sayHello
是实例方法(即没有 static
关键字的普通方法)。您可以使用关键字 this
来引用实例。
例如,
public void sayHello (String name) {
System.out.println("Hello, " + name);
System.out.println(this);
}
如果分别调用 t1.sayHello()
和 t2.sayHello()
,您将观察到差异。
所以回到你的情况,如果你的实例方法不包括使用this
,你应该考虑将它声明为静态的(这样你就不必在调用它之前创建一个Test对象).
他们每个人都有自己的 sayHello 方法。最好的证明方法是用这样的例子:
public class Person {
private String name;
private int age;
public Person ( String name, int age ) {
this.name = name;
this.age = age;
}
public String toString() {
return "Hello " + name + ", you have " + age + " years!";
}
}
你还有另一个 class:
class Myclass {
public static void main ( String [] args ) {
Person object1 = new Person( 'Edward', 19 );
Person object2 = new Person( 'Fredd', 21 );
System.out.println(object1);
System.out.println(object1);
}
}
输出为:
Hello Edward, you have 19 years!
Hello Fred, you have 21 years!
这意味着每个对象都不依赖于另一个。
例如,我生成一个 class 这样的:
public class Test {
public void sayHello (String name) {
System.out.println("Hello, " + name);
}
}
当我像这样创建多个实例时:
Test t1 = new Test();
Test t2 = new Test();
那么对象 t1 和 t2 是共享相同的方法 sayHello
,还是它们都有自己的 sayHello
方法?
方法属于一个class的所有对象,不管你实例化了多少个对象。 class 的所有方法的代码放在内存中的一个共享位置,class 的所有实例为每个方法引用相同的代码。
这种共享是可能的,因为方法代码不会因实例而异。
实际情况下,如果想共享同一个方法sayHello
,可以声明为静态方法
public static void sayHello (String name) {
System.out.println("Hello, " + name);
}
然后Test.sayHello()
(推荐),t1.sayHello()
和t2.sayHello()
效果一样。
否则,如果 sayHello
是实例方法(即没有 static
关键字的普通方法)。您可以使用关键字 this
来引用实例。
例如,
public void sayHello (String name) {
System.out.println("Hello, " + name);
System.out.println(this);
}
如果分别调用 t1.sayHello()
和 t2.sayHello()
,您将观察到差异。
所以回到你的情况,如果你的实例方法不包括使用this
,你应该考虑将它声明为静态的(这样你就不必在调用它之前创建一个Test对象).
他们每个人都有自己的 sayHello 方法。最好的证明方法是用这样的例子:
public class Person {
private String name;
private int age;
public Person ( String name, int age ) {
this.name = name;
this.age = age;
}
public String toString() {
return "Hello " + name + ", you have " + age + " years!";
}
}
你还有另一个 class:
class Myclass {
public static void main ( String [] args ) {
Person object1 = new Person( 'Edward', 19 );
Person object2 = new Person( 'Fredd', 21 );
System.out.println(object1);
System.out.println(object1);
}
}
输出为:
Hello Edward, you have 19 years!
Hello Fred, you have 21 years!
这意味着每个对象都不依赖于另一个。