怎么理解JAVA中构造函数不能被继承

gannian 2009-11-08 11:44:54
怎么理解JAVA中构造函数不能被继承.最好是给个对像模型,结合现实世界中对像的例子.别给我看代码,别告诉我是语法是那样


的.比如理解继承可以用:


动物------高级动物-------人.


最好能提供一个类似这样的例子来理解构造函数不能被继承.
...全文
1704 23 打赏 收藏 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaixinbook 2011-08-14
  • 打赏
  • 举报
回复
我认为该这样解释:
构造函数既不是static final的,因为static修饰的会在类加载的时候,就加载static修饰的静态块和其他静态成员,做个测试看就知道,在加载类的时候(即是用new创建对象前)构造函数里没有反应,前提是你在构造函数里别定义static的变量,不然他也会被加载的,这就排除了是static的可能。final的嘛,用在方法的前面标示该方法不能被重写,却没有说是不能被继承吧;但是构造函数前面的修饰符一般就只有哪几种,如果是public和procted,和无修饰符时,说明子类能够继承并能使用,但是当你在用方法的时候却没能发现父类这样的构造函数出现,也排除了构造函数能被继承的说法;你还会说pirvate修饰的时候,也不能发现从子类继承的方法吧,若果是这样,当你不是private的时候继承父类不会出错,然是private的时候会报错,两者一比较不就知道也不可能是private了嘛。
和平强大平和 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 scarjia 的回复:]
构造函数不能继承 ??? 谁说的???
如果子类的构造方法中没有显示地调用父类的构造方法,系统默认调用父类无参的构造方法
如果子类的构造方法中没有显示地调用父类的构造方法,而父类又没有无参的构造方法,则编译出错!

Java code

class Person {
private int age;
public Person(int age) ……
[/Quote]


你这里只是对父类构造函数的引用,不是继承;
至于不写那句话会抱错,是因为系统会调用默认的无参的构造函数,但是在父类中被你覆盖了,系统就不再提供无参的构造函数。
如果是继承的话,就等于在外面有一个和子类同等地位的构造函数,
如果这样的话,方法名和类名又不同,所以又不是构造函数,又没有返回类型,所以连方法都不是,语法都行不通的


所以构造函数是可以在子类中调用,而不能继承
xingyunliushui1 2010-06-03
  • 打赏
  • 举报
回复
这样理解更好
class Person{

Person() {
System.out.println("父类构造函数");
}
Person(int a) {
System.out.println("带参数的父类构造函数");
}

}
public class Test extends Person {

public Test() {

System.out.println("子类构造函数");
}

public Test(int a) {
Person(12);//错误吧 只能用super(12)吧,如果能继承的话就应该可以写成Person(12); System.out.println("带参数的子类构造函数");
}

public static void main(String[] args) {
Test a=new Test(12);


}

}
gannian 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 r4141496091 的回复:]
构造函数已经等于一个实体了,比如拿你的动物来说,你这个动物如果用了java的new语句,那样就用了动物的构造函数,创建一个实实在在的动物出来,这个实体化的动物是个个体,或者可以说是一个对象,那样他是独立存在的,当然不能被继承
但是类就不同了,动物这个类可以被狗这个类继承.

你这样理解就好了,构造函数是针对对象的(就是我举例那个动物实体一样),除了构造函数其他都是针对抽象的,也就是类(动物没实体化之前就是一种抽象,)就这么简单
[/Quote]
谢谢..这种理解我挺认同的..就是差不多是分类为个别对像实例单独处理的.我开始也是这么想的.你的理解还是深一点...不过想看看大家意见.看看有没有更好的.
scarjia 2009-11-09
  • 打赏
  • 举报
回复
构造函数不能继承 ??? 谁说的???
如果子类的构造方法中没有显示地调用父类的构造方法,系统默认调用父类无参的构造方法
如果子类的构造方法中没有显示地调用父类的构造方法,而父类又没有无参的构造方法,则编译出错!

class Person {
private int age;
public Person(int age) {
this.age = age;
}
}

class Student extends Person{
private String name;
public Student(String name,int age) {
super(age); //如果没有这句话,编译会出错! 因为在父类中定义了一个构造方法
this.name = name;
}
}

public class TestInherit {
public static void main(String[] args) {
Person p1 = new Person(12);
Student stu = new Student("tom",14);
}
}
hesling 2009-11-09
  • 打赏
  • 举报
回复
如果构造函数可被继承那你和你爸和你所有祖宗都完全一样了

这么理解吧:你和你爸爸同是一个构造器构造出来的,也就是你和你爸都是你爷爷和你奶奶他们的构造器构造出来的
97095639 2009-11-09
  • 打赏
  • 举报
回复
mark
loveofmylife 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guodong66 的回复:]
构造方法本身是static final的方法,final的方法不能被重写。你问的问题不对,方法不能被继承。
[/Quote]
Constructors (§8.8) and type variables (§4.4) are not members.所以不能被继承
构造方法本身是static final的方法????
Constructors是可以被重载的,怎么可能是final!!!
Constructors在其中是可以访问本类的非静态属性,能使用this,所以他也不是static
方法不能被继承????????
# Members inherited from its direct superclass (§8.1.4), except in class Object, which has no direct superclass
# Members inherited from any direct superinterfaces (§8.1.5)
# Members declared in the body of the class (§8.1.6)
The members of a class type (§8.2) are classes (§8.5, §9.5), interfaces (§8.5, §9.5), fields (§8.3, §9.3, §10.7), and methods (§8.4, §9.4). Members are either declared in the type, or inherited because they are accessible members of a superclass or superinterface which are neither private nor hidden nor overridden (§8.4.8).
whut0802 2009-11-09
  • 打赏
  • 举报
回复
static修饰的方法能被继承,只是不能被重写
BearKin 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guodong66 的回复:]
构造方法本身是static final的方法,final的方法不能被重写。你问的问题不对,方法不能被继承。
[/Quote]


构造函数是static的 但是不是FINAL的我不知道..static的不知道能不能继承 既然继承是针对于面向对象来说的..类方法是继承不了的吧 没实验过的BK留...
guodong66 2009-11-09
  • 打赏
  • 举报
回复
构造方法本身是static final的方法,final的方法不能被重写。你问的问题不对,方法不能被继承。
taigarz 2009-11-09
  • 打赏
  • 举报
回复
构造函数本质是静态的
gannian 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 z649010333 的回复:]
怎么感觉有些人回答的很乱
[/Quote]


是的..11楼的回答是我要的答案..很经典....
z649010333 2009-11-09
  • 打赏
  • 举报
回复
怎么感觉有些人回答的很乱
Heart_X_Raid 2009-11-09
  • 打赏
  • 举报
回复
这题要是猛一问,还真有点晕:

我觉得,LZ关于“构造器继承”的意思可以用“方法继承”的意思来理解:

LZ的意思是:如果class A extends B, 子类A中没有B的构造器public B(){},但由于父类B具有。所以A继承了B的这个构造器,我们就可以这样写了 A a=new B();

当然,谁都知道这是不可以的。构造器并不是方法。至于为什么?
(1) 通俗的解释 可以参照楼11
(2) 深奥点的解释 可以参照楼15

总之,不要把构造器看成是类的成员方法,这绝对是两码事。
heixia2025 2009-11-09
  • 打赏
  • 举报
回复
把extends理解成扩展而不是继承的意思 就好理解多了
gannian 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chenfeibiao328 的回复:]
引用 9 楼 viszl 的回复:
引用 6 楼 guodong66 的回复:
构造方法本身是static final的方法,final的方法不能被重写。你问的问题不对,方法不能被继承。

Constructors (§8.8) and type variables (§4.4) are not members.所以不能被继承
构造方法本身是static final的方法????
Constructors是可以被重载的,怎么可能是final!!!
Constructors在其中是可以访问本类的非静态属性,能使用this,所以他也不是static
方法不能被继承????????
# Members inherited from its direct superclass (§8.1.4), except in class Object, which has no direct superclass
# Members inherited from any direct superinterfaces (§8.1.5)
# Members declared in the body of the class (§8.1.6)
The members of a class type (§8.2) are classes (§8.5, §9.5), interfaces (§8.5, §9.5), fields (§8.3, §9.3, §10.7), and methods (§8.4, §9.4). Members are either declared in the type, or inherited because they are accessible members of a superclass or superinterface which are neither private nor hidden nor overridden (§8.4.8).


推荐这个,回答得很专业!楼主应该学会查看帮助文档!
[/Quote]


重载跟重写都没分清呢.."Constructors是可以被重载的,怎么可能是final!!! "
chenfeibiao328 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 viszl 的回复:]
引用 6 楼 guodong66 的回复:
构造方法本身是static final的方法,final的方法不能被重写。你问的问题不对,方法不能被继承。

Constructors (§8.8) and type variables (§4.4) are not members.所以不能被继承
构造方法本身是static final的方法????
Constructors是可以被重载的,怎么可能是final!!!
Constructors在其中是可以访问本类的非静态属性,能使用this,所以他也不是static
方法不能被继承????????
# Members inherited from its direct superclass (§8.1.4), except in class Object, which has no direct superclass
# Members inherited from any direct superinterfaces (§8.1.5)
# Members declared in the body of the class (§8.1.6)
The members of a class type (§8.2) are classes (§8.5, §9.5), interfaces (§8.5, §9.5), fields (§8.3, §9.3, §10.7), and methods (§8.4, §9.4). Members are either declared in the type, or inherited because they are accessible members of a superclass or superinterface which are neither private nor hidden nor overridden (§8.4.8).

[/Quote]
推荐这个,回答得很专业!楼主应该学会查看帮助文档!
gannian 2009-11-09
  • 打赏
  • 举报
回复
看了上面的这么多回贴。。发现很多人有空还是去看看基础类的书。。。对将来的面试有好处。尽管这些东东可能用得少。。但面试的那帮鸟人。经常问到。。。
gannian 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hesling 的回复:]
如果构造函数可被继承那你和你爸和你所有祖宗都完全一样了

这么理解吧:你和你爸爸同是一个构造器构造出来的,也就是你和你爸都是你爷爷和你奶奶他们的构造器构造出来的
[/Quote]


这个解释经典..NB
加载更多回复(3)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧