当创建多个类的实例时,会生成多少个方法副本?

时间:2015-04-02 02:20:48

标签: java class methods

例如,我生成一个这样的类:

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方法?

3 个答案:

答案 0 :(得分:2)

无论您实例化多少个对象,方法都属于类的所有对象。类的所有方法的代码都放在内存中的共享位置,并且类的所有实例都为每个方法引用相同的代码。

这种共享是可能的,因为方法代码不会从实例变为实例。

答案 1 :(得分:2)

他们每个人都有自己的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 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);
    }
}

输出为:

  爱德华,你有19年了!

     你好弗雷德,你有21年了!

这意味着每个对象都不依赖于另一个。

答案 2 :(得分:1)

在实际情况中,如果要共享相同的方法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对象) )。