NoobyGoo 2019-02-21 20:34 采纳率: 0%
浏览 569
已采纳

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条回答 默认 最新

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请问各位,如何在Jetson nano主控板的Ubuntu系统中安装PyQt5
  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码
  • ¥400 微信停车小程序谁懂的来
  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析
  • ¥15 安装ubantu过程中第一个vfat 文件挂载失败
  • ¥20 GZ::CTF如何兼容一些靶机?
  • ¥15 etcd集群部署问题
  • ¥20 谁可以帮我一下问一下各位
  • ¥15 为何重叠加权后love图的SMD与svyCreateTableOne函数绘制基线表的不一致
  • ¥150 求 《小魔指》街机游戏机整合模拟软件