A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© rolling-stone 中级黑马   /  2014-8-1 10:51  /  1146 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看到一个父类,是这样写的:
  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};
还有父类的构造函数在继承关系中,可不可以继承?如果可以为什么?

12 个回复

倒序浏览
因为很多时候的属性是私有的,你不能直接访问,要通过set方法设置。
可以继承啊,你调用super不就好了。
回复 使用道具 举报
star5603 发表于 2014-8-1 10:54
因为很多时候的属性是私有的,你不能直接访问,要通过set方法设置。
可以继承啊,你调用super不就好了。 ...

那像上面这样既谢了那个有参数的构造函数,也写了setName函数,是不是就有点重复了
回复 使用道具 举报
rolling-stone 发表于 2014-8-1 10:55
那像上面这样既谢了那个有参数的构造函数,也写了setName函数,是不是就有点重复了 ...

不是说了如果成员是私有的,你是在初始化的时候通过含参的构造函数设置了这个成员,那如果后面的程序你要改这个成员呢。
回复 使用道具 举报
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:02 编辑

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

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

回复 使用道具 举报
star5603 发表于 2014-8-1 10:59
不是说了如果成员是私有的,你是在初始化的时候通过含参的构造函数设置了这个成员,那如果后面的程序你要 ...

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

好的,懂了,谢了.
回复 使用道具 举报
Peach2014 发表于 2014-8-1 11:23
你不是写了一个空的构造函数吗?我们这么想,如果你声明一个对象,使用的是这个空的构造函数,
Bird b = ne ...

好的,谢谢,看来还是自己打代码打的少,现在正在努力。哈哈
回复 使用道具 举报
前来学习观摩
回复 使用道具 举报
当new了一个对象,用setName(),改名字只是改了该对象的名字,但是还是这个对象
但是你另外new一个对象,用构造方法该名字,那么就是两个对象了,上一个对象的名字没变,你只是加了一个对象,这两个对象的名字不一样
这两者区别就是:方法是改了对象的属性,对象还是只有一个,对象的名字变了
                           new是添加个对象,两个对象,有两个不同的名字
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马