NoobyGoo
NoobyGoo
采纳率33.3%
2019-02-21 20:34 阅读 517
已采纳

Java构造器和构造方法只是为了初始化吗?

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
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    caozhy 从今以后生命中的每一秒都属于我爱的人 2019-02-21 20:36

    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;
    }
    }
    这样,你只能通过构造函数构造一个地址,并且要么这一行成功,要么这一行报错,整个对象都没有
    不会出现状态不一致的对象

    点赞 评论 复制链接分享

相关推荐