public class ex11_2 {
public static void main(String[] args){
Object a=new Person("abc1","def1","ghi1");
System.out.println(a.toString());
Object b=new Person("abc2","def2","ghi2");
System.out.println(a.toString());
}
}
class Person{
private static String name;
private static String address;
private static String phoneNo;
public Person(){
}
public Person(String name,String address,String phoneNo){
setName(name);
setAddress(address);
setPhoneNo(phoneNo);
}
public String toString(){
return super.toString()+(" "+getName()+","+getAddress()+","+getPhoneNo()+".");
}
public static String getName() {
return Person.name;
}
public static void setName(String name) {
Person.name = name;
}
public static String getAddress() {
return address;
}
public static void setAddress(String address) {
Person.address = address;
}
public static String getPhoneNo() {
return phoneNo;
}
public static void setPhoneNo(String phoneNo) {
Person.phoneNo = phoneNo;
}
}
大家好。我是Java编程的初学者,想在OOP上提问。在这个小程序中,我创建了一个Person类并测试其toString()方法。
测试结果如下:
Person@635b9e68 abc1,def1,ghi1.
Person@635b9e68 abc2,def2,ghi2.
我想知道为什么在创建b之后b的数据字段将替换a的数据字段。 感谢
答案 0 :(得分:5)
您的成员变量是静态的,不会附加到该类的任何实例。
private static String name;
private static String address;
private static String phoneNo;
静态成员将在该类的实例之间可用。要更正它,请将它们更改为非静态成员变量。
private String name;
private String address;
private String phoneNo;
答案 1 :(得分:1)
由于name
,address
和phoneNo
字段被声明为静态,因此类Person
的所有对象只有一个副本,或者这些变量是共享的在这个班级的所有对象中。
答案 2 :(得分:0)
因为您已将类变量声明为static
private static String name;
private static String address;
private static String phoneNo;
这意味着Person
的每个实例都具有完全相同的值
答案 3 :(得分:0)
基本上,您正在使用类的static
变量,它类似于该类的所有实例(对象)的全局变量。因此,如果要修改实例(非静态)方法中的静态变量,则它们的修改将反映为全局。