Java构造器和构造方法的意义是什么?有什么用?
运行结果看有两个问题不明白:
1、为什么A[1]、A[2]可以调用toString方法,A[3]不能调用x方法?
2、输出的这串字符“Car@12204a1”是什么意思?地址吗?
父类Car
public class Car
{
public String name;
public double price;
public int id;
public int num;
public double weight;
public Car(int id,String name,double price,int num,double weight)//构造器不能加void
{
this.id=id;
this.name=name;
this.price=price;
this.num=num;
this.weight=weight;
}
public String x()
{
return id+" "+name+" "+price+" "+num+" "+weight;
}
}
子类getManCar
class getManCar extends Car
{
public getManCar(int id,String name,double price,int num)
{
super(id, name, price, num, 0);
}
public String toString()
{
return id+" "+name+" "+price+" "+num+" "+0;
}
}
运行下面程序
Car[] A=new Car[3];
A[0]=new getManCar(1,"奥迪A4",500.0,4);
A[1]=new getManCar(2,"马自达6",400.0,4);
A[2]=new Car(3,"皮卡雪6",400.0,4,2.0);
for(int i=0;i<A.length;i++)
{
System.out.println(A[i]);
}
得到结果
1 奥迪A4 500.0 4 0
2 马自达6 400.0 4 0
Car@12204a1
Car[] A=new Car[3];
数组下标从0开始,你长度是3,那么下标是0 1 2,没有3,3越界了。
Car[] A=new Car[4];
才有A[3]
Car@12204a1
是默认的Car的toString方法实现,如果你没有重写toString的话,后面的数字是一个Hash值。
Java构造器和构造方法只是为了初始化?
除了初始化,还用于禁用初始化,比如说在单例模式(singleton pattern)里,封闭构造函数,避免类外部初始化更多的实例
构造函数还用于产生不变(invariant)的对象
所谓不变的对象就是,对象一旦构造,就不会再改变其状态。这对于需要对象具有原子性非常有用。
比如说对于地址:
class Address
{
public String 省;
public String 市;
public String 区;
}
如果我们这么调用
Address addr = new Address();
addr.省 = "广东";
addr.市 = xxx //假如这一行报错了。
那么就会出现一个地址对象,有省,没有市区。
或者
Address addr = new Address();
addr.省 = "广东";
addr.市 = "广州";
addr.区 = "白云";
...
addr.省 = "山东";
addr.市 = "济南";
addr.区 = xxx //假如这一行报错了,导致区还是之前的
那么就会出现一个 山东省济南市白云区
以上这些地址都是非法的。
而使用构造函数,就不会有这个问题
class Address
{
private String _省;
private String _市;
private String _区;
public String get省() { return _省; }
public String get市() { return _市; }
public String get区() { return _区; }
public Address(String p, String c, String c)
{
_省 = p;
_市 = c;
_区 = d;
}
}
这样,你只能通过构造函数构造一个地址,并且要么这一行成功,要么这一行报错,整个对象都没有
不会出现状态不一致的对象