java中的构造函数为什么不自动被子类复用? 本帖最后由 milunhailili 于 2011-12-09 18:02:16 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 父类提供了多个构造函数,你子类爱怎么构造就怎么构造啊.反正父类就是提供了这些函数.class Person{ String name; public void setName(String name) { this.name=name; } public String getName(){ return this.name; }}你的题目中,如果省略了,你可以Student s = new Student(); 只是它的name是空的而已 但是java这样设计为对象的初始化带来了一定的麻烦。因为父类的构造函数不能默认成为子类的构造函数。 milunhailili的提问非常好,JAVA就是当初设计的时候,没有通过,将这一点(跟milunhailili所想得一样)想到,所以导致了milunhailili所说的为对象的初始化带来了麻烦,子类只能通过super关键字来显示调用父类的构造方法。 怎么没几个人来讨论这个问题呢?既然Java放弃了这种想法,我想一定是有它的道理的。是不是我的提问太长了,导致一些人懒得看。。不要浮躁,要有耐心。 "但是java,c++中都是设计成不能自动被子类调用"无论还是c++,如果没有显式调用父类的构造方法,都会自动调用父类无参的构造方法你不会想它们自动调用父类有参的构造方法吧 class Student extends Person{ void eat(){ System.out.println(name + "-->用筷子吃饭"); } Student(){ super(); } Student(String address){ super(name);//你不会想这里的address自动传给name吧 }} LZ的意思大概是构造方法不能被继承吧很简单,因为父亲的构造方法不一定会适合子类,比如子类参数变多的情况,并且,如果继承了话,在代码中该如何使用了,子类 z = new 父类构造方法(),这可是错误的,所以子类继承构造方法的就没什么意义了但是子类完全可以调用父类的构造方法如果子类没有显示的调用super方法,则会自动调用父类没有参数的构造方法,反之,则调用super指定的方法,这样就完全可以复用父类的构造方法了 回楼上:其实楼主说的应该是为什么子类为什么不能默认自动继承父类的构造器。比如说,class Person{ Person(String name){ //... }}class Student{ //..不需显示的声明自己的构造器}class Test{ static void main(String[] args){ new Student("NAME");//默认自动继承父类的构造器! }}不知是不是楼主的想法?或许这当时设计java语言时没有考虑到吧?其实这样也未尝不好,虽说有时有些累赘,但也不失灵活性比如,当子类的构造器完全没必要或不需要完成与父类相同的初始化时这样显示的声明然后完成子类想要完成的初始化就行了,而如果自动继承父类额构造器则可能限制子类完成一些不必要的从父类继承下来的初始化动作!个人意见仅供交流! 很简单,举个例子:假设B继承A:class A:private String name;public A(String name) {this.name = name;}public void showName() {System.out.println(name);}class B (extends class A):private String name;public void showName() {System.out.println(name);}main方法中:B b = new B("xxxx");b.showName(); // print null?!看出来问题了吗?你明明已经传入了一个名字,但show出来的却是null其实这只是问题之一而已。构造方法不同于一般的方法,不能让子类随便继承的 上面的类B中,重不重写showName方法都是一样的,B类只要定义name变量就行,结果一样 Student(String name) 方法可以省略,还可以这样构造Student 对象:Student s = new Student();s.name="sunny"; 说到继承,大家都说子类会继承父类中除private修饰的fields(字段)和methods(方法)。再读了一遍,是子类会继承父类中除private修饰的fields(字段)和methods(方法)。构造器不是method,就是这样。 这个问题其实困扰我很久了。可能就是一种人为规定或者取舍吧。确实如果父类的构造函数初始化了父类的某个私有变量,这样子类自动继承的时候带来了一定的问题。除此之外我想不到其它的问题。但是却给子类的初始化带来了更大的方便,所以我一直觉得子类自动继承是利大于弊的。之前一直用Delphi,它也正是父类的构造函数自动成为子类的,让我的思维有了定势,认为这样是自然的,可能也是我的思维固化吧。我觉得一门语言,越自然越好,人为规定的东西越少越好(除了语法之外)。像java类库中的命中我就蛋疼了很久。像Reader 和InputStream从作用上来看,应该算是兄弟类,可是这名取得。。而且这是终端类,这命名完全看不出作用。与编程理论中的见名知义不符合。我也只是发发牢骚,肯定无法理解国外大牛们的思维,可能别人有其它方面的考虑吧。 子类构造默认调用父类的无参构造! 当父类是只有有参构造时,因该在子类指明调用父类有参构造“super(....)” 关于synchronized参数问题 java调用并口打印机打印并获取状态的问题,纠结了好久还是不行?请大侠指点迷津 按照要求,求设计验证 IP 的思路 对文本文件的读写 在类里面 如何将回车去掉 JComboBox控件,不使用setEnabled方法,如何能让其不弹出下拉窗口?谢谢。 一直困扰我的技术问题,请前辈不要吝啬,真诚的向您请教 祝贺: 新《Java憩园》正式开放:http://www.JavaGarden.net jbuilder9的配置问题!!! 关于新建对象的构造函数运行 Java 如何获取被注解的类元素 java里有高精度的计时器吗?
{ String name;
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
}你的题目中,如果省略了,你可以
Student s = new Student();
只是它的name是空的而已
既然Java放弃了这种想法,我想一定是有它的道理的。是不是我的提问太长了,导致一些人懒得看。。不要浮躁,要有耐心。
无论还是c++,如果没有显式调用父类的构造方法,都会自动调用父类无参的构造方法你不会想它们自动调用父类有参的构造方法吧
class Student extends Person{
void eat(){
System.out.println(name + "-->用筷子吃饭");
}
Student(){
super();
}
Student(String address){
super(name);//你不会想这里的address自动传给name吧
}
}
很简单,因为父亲的构造方法不一定会适合子类,比如子类参数变多的情况,
并且,如果继承了话,在代码中该如何使用了,
子类 z = new 父类构造方法(),这可是错误的,所以子类继承构造方法的就没什么意义了但是子类完全可以调用父类的构造方法如果子类没有显示的调用super方法,则会自动调用父类没有参数的构造方法,反之,则调用super指定的方法,这样就完全可以复用父类的构造方法了
其实楼主说的应该是为什么子类为什么不能默认自动继承父类的构造器。
比如说,
class Person{
Person(String name){
//...
}
}class Student{
//..不需显示的声明自己的构造器
}class Test{
static void main(String[] args){
new Student("NAME");//默认自动继承父类的构造器!
}
}不知是不是楼主的想法?
或许这当时设计java语言时没有考虑到吧?
其实这样也未尝不好,虽说有时有些累赘,但也不失灵活性
比如,当子类的构造器完全没必要或不需要完成与父类相同的初始化时这样显示的声明然后完成子类想要完成的初始化就行了,而如果自动继承父类额构造器则可能限制子类完成一些不必要的从父类继承下来的初始化动作!个人意见仅供交流!
假设B继承A:
class A:private String name;
public A(String name) {
this.name = name;
}
public void showName() {
System.out.println(name);
}class B (extends class A):
private String name;
public void showName() {
System.out.println(name);
}
main方法中:B b = new B("xxxx");
b.showName(); // print null?!
看出来问题了吗?你明明已经传入了一个名字,但show出来的却是null
其实这只是问题之一而已。构造方法不同于一般的方法,不能让子类随便继承的
Student(String name) 方法可以省略,
还可以这样构造Student 对象:
Student s = new Student();
s.name="sunny";
确实如果父类的构造函数初始化了父类的某个私有变量,这样子类自动继承的时候带来了一定的问题。
除此之外我想不到其它的问题。
但是却给子类的初始化带来了更大的方便,所以我一直觉得子类自动继承是利大于弊的。
之前一直用Delphi,它也正是父类的构造函数自动成为子类的,让我的思维有了定势,认为这样是自然的,
可能也是我的思维固化吧。我觉得一门语言,越自然越好,人为规定的东西越少越好(除了语法之外)。
像java类库中的命中我就蛋疼了很久。像Reader 和InputStream从作用上来看,应该算是兄弟类,可是这名取得。。而且这是终端类,这命名完全看不出作用。与编程理论中的见名知义不符合。我也只是发发牢骚,肯定无法理解国外大牛们的思维,可能别人有其它方面的考虑吧。
当父类是只有有参构造时,因该在子类指明调用父类有参构造“super(....)”