黑马程序员技术交流社区

标题: 构造函数的问题 [打印本页]

作者: rolling-stone    时间: 2014-8-1 10:51
标题: 构造函数的问题
今天看到一个父类,是这样写的:
  1. class Bird
  2. {
  3.         public Bird(){}
  4.         public Bird(String name)
  5.         {
  6.                 this.name = name;
  7.         }
  8.         public void Walk()
  9.         {
  10.                 System.out.println("Walk");
  11.         }
  12.         public getNmae()
  13.         {
  14.                 return name;
  15.         }
  16.         public setNmae(String)
  17.         {
  18.                 this.name = name;
  19.         }
  20. }
复制代码
请问其中,已经定义了Bird(String name){this.name = name};le
为什么还要定义setNmae(String name){this.name = name};
还有父类的构造函数在继承关系中,可不可以继承?如果可以为什么?


作者: star5603    时间: 2014-8-1 10:54
因为很多时候的属性是私有的,你不能直接访问,要通过set方法设置。
可以继承啊,你调用super不就好了。
作者: rolling-stone    时间: 2014-8-1 10:55
star5603 发表于 2014-8-1 10:54
因为很多时候的属性是私有的,你不能直接访问,要通过set方法设置。
可以继承啊,你调用super不就好了。 ...

那像上面这样既谢了那个有参数的构造函数,也写了setName函数,是不是就有点重复了
作者: star5603    时间: 2014-8-1 10:59
rolling-stone 发表于 2014-8-1 10:55
那像上面这样既谢了那个有参数的构造函数,也写了setName函数,是不是就有点重复了 ...

不是说了如果成员是私有的,你是在初始化的时候通过含参的构造函数设置了这个成员,那如果后面的程序你要改这个成员呢。
作者: fantacyleo    时间: 2014-8-1 11:00
Bird(String name)是构造函数,只在new对象时调用,如果你new完了对象,后来又想改name,就得用setName了。构造函数不是类的成员,不能继承,这个在Java语言规范中已经明确了:Constructors, static initializers, and instance initializers are not members and therefore are not inherited。
作者: 玥夜    时间: 2014-8-1 11:00
本帖最后由 玥夜 于 2014-8-1 11:02 编辑

关于写setName的方法是为了可以修改在构造函数里设置的name的;就是如果你一开始初始化对象输入的是zhangsan    现在想让他变成lisi就可以用setName的方法了。。。而父类的构造方法是通过super()在子类构造方法第一行调用过来的  子类他有自己的函数方法名字  与父类的名字是不一样的
作者: 孤守星空    时间: 2014-8-1 11:01
一个是新建类,一个调用方法,不同吧
作者: Peach2014    时间: 2014-8-1 11:23
本帖最后由 Peach2014 于 2014-8-1 11:25 编辑

你不是写了一个空的构造函数吗?我们这么想,如果你声明一个对象,使用的是这个空的构造函数,
Bird b = new Bird();
那你怎么设置name的值?
只有通过setName方法来设置。
b.setName("BeeBird");
所以这个setName方法并不是多余的!
另外,按照规范,类中的成员变量一般不会让外部对象直接进行修改的,都会封装成方法(get获取,set设置),你将来参加工作就会了解到的。
每个类都有自己的构造函数,并且构造函数是与类名相同的,就算你不写,系统也会自动生成一个空的构造函数。所以不会被继承。但是可以被调用,子类是可以通过在自己的构造函数中super()方法来调用父类的对应构造函数。


作者: rolling-stone    时间: 2014-8-1 11:25
star5603 发表于 2014-8-1 10:59
不是说了如果成员是私有的,你是在初始化的时候通过含参的构造函数设置了这个成员,那如果后面的程序你要 ...

那我通过这个含参数的构造函数来改成员不可以吗?干嘛还有去再定义一个方法来改成员.
作者: rolling-stone    时间: 2014-8-1 11:26
fantacyleo 发表于 2014-8-1 11:00
Bird(String name)是构造函数,只在new对象时调用,如果你new完了对象,后来又想改name,就得用setName了。 ...

好的,懂了,谢了.
作者: rolling-stone    时间: 2014-8-1 11:28
Peach2014 发表于 2014-8-1 11:23
你不是写了一个空的构造函数吗?我们这么想,如果你声明一个对象,使用的是这个空的构造函数,
Bird b = ne ...

好的,谢谢,看来还是自己打代码打的少,现在正在努力。哈哈
作者: 钟伟    时间: 2014-8-1 11:45
前来学习观摩
作者: liqi    时间: 2014-8-1 12:10
当new了一个对象,用setName(),改名字只是改了该对象的名字,但是还是这个对象
但是你另外new一个对象,用构造方法该名字,那么就是两个对象了,上一个对象的名字没变,你只是加了一个对象,这两个对象的名字不一样
这两者区别就是:方法是改了对象的属性,对象还是只有一个,对象的名字变了
                           new是添加个对象,两个对象,有两个不同的名字




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2