2015-04-02 52 views
1

例如,我生成這樣一個類:在創建一個類的多個實例時會生成多少個方法副本?

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

回答

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對象)。

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年!

這意味着每個對象no都依賴於其他對象。