子类当然可以调用父类的构造函数,
但是你的三个类都没有指明要继承谁,如extends ParentCC或extends ChildCC,
当然使用super(i)会出现错误了
如果你的“孙子”类是继承“父亲”类,就不会有错。
方法如下:
public class GrandChildCC extends ParentCC{
GrandChildCC(int i){
super(i);
System.out.println(";") ;
}
public static void main(String[] args) {
}
}
或者使用以下方法:
public class ParentCC {
public ParentCC(){
System.out.println("parent") ;
}
public ParentCC(int i){
System.out.println("parent:"+i) ;
}}
//---------------------------------------------
public class ChildCC extends ParentCC{
public ChildCC(int i){
super(i);
}
public ChildCC(int i,int j){
System.out.println("child:"+i) ;
}}
//---------------------------------------------
public class GrandChildCC extends ChildCC{
GrandChildCC(int i){
super(i);
System.out.println(";") ;
}
public static void main(String[] args) {
}
}
但是你的三个类都没有指明要继承谁,如extends ParentCC或extends ChildCC,
当然使用super(i)会出现错误了
如果你的“孙子”类是继承“父亲”类,就不会有错。
方法如下:
public class GrandChildCC extends ParentCC{
GrandChildCC(int i){
super(i);
System.out.println(";") ;
}
public static void main(String[] args) {
}
}
或者使用以下方法:
public class ParentCC {
public ParentCC(){
System.out.println("parent") ;
}
public ParentCC(int i){
System.out.println("parent:"+i) ;
}}
//---------------------------------------------
public class ChildCC extends ParentCC{
public ChildCC(int i){
super(i);
}
public ChildCC(int i,int j){
System.out.println("child:"+i) ;
}}
//---------------------------------------------
public class GrandChildCC extends ChildCC{
GrandChildCC(int i){
super(i);
System.out.println(";") ;
}
public static void main(String[] args) {
}
}
GrandChildCC gc=new GrandChildCC(4);
你就可以看到结果是:
-------
parent:4
;
-------
可以看出GrandChildCC确实调用了ParentCC的构造函数
问题已经解决,现整理如下,望各位指正!!!
=======================
1.为什么孙子不能直接调用爷爷的构造函数?父亲不是已经继承了爷爷的构造函数吗?
下面的文件中GrandChildCC.java中的super(i)编绎报错,通不过?小结:
A.类可以限制子类的构造方法!是因为子类如果不显示覆盖父类的构造函数,那么父类的构造函数就已经在子类去除了 。
B.由A可得:
派生类只能调用它的基类的构造函数,而不能直接调用它的祖先类的构造函数。
当然经常会出现这种情况,孙子调用父亲的构造函数时,父亲的构造函数又调用爷爷的构造函数。下面是我现在的文件-----------------------------------------------------------
a.ParentCC.java文件 父亲类
-----------------------------------public class ParentCC {
public ParentCC(){
System.out.println("parent") ;
}
public ParentCC(int i){
System.out.println("parent:"+i) ;
}
public void f(){
System.out.println("parent:f") ;
}
public ParentCC(String s){
System.out.println("parent:s "+s) ;
}}----------------------------
b.ChildCC.java文件 儿子类
-----------------------------------
public class ChildCC extends ParentCC{
public ChildCC(int i,int j){
System.out.println("child:"+i) ;
}
//注意:此处的构造函数不需要super(s)是因为
//在它的父类ParentCC中定义了无参数构造函数,
//此处会自动调用父类ParentCC中的无参数构造函数
public ChildCC(String s){
System.out.println("child:s "+s) ;
}}----------------------------
c.GrandChildCC.java 孙子类
------------------------------
public class GrandChildCC extends ChildCC{
GrandChildCC(int i){
//用super(i)调用爷爷的构造函数会编绎报错!也就是说只能调用父亲的构造函数
//!super(i) ;
super(i,5) ;
f() ; //可以调用爷爷的一般方法
System.out.println(";") ;
}
//因为此类的父类ChildCC中没有定义无参数的构造函数,
//所以必须显示调用super(参数),否则会编绎报错.
public GrandChildCC(String s){
super(s) ;
System.out.println("child:s "+s) ;
}
public static void main(String[] args) {
new GrandChildCC("4") ;
}
}PS:在三种情况下子类继承时关于构造函数的情况:父类只有不带参数的构造函数,父类只有带参数的构造函数,父类既有带参数的构造函数又有不带参数的构造函数A.父类的构造函数只有一个无参数的构造函数:
如果父类的构造函数是默认的(即不带参数的),不管派生类的构造函数是否带数,则派生类的构造函数一定会自动地调用基类的构造函数。 当然明确的用super()调用也可以。
这个派生类继续派生下来的类也遵循此规定,因此如果整个类系都是默认的构造函数,则会依次调用,从祖先的构造函数开始调用起,一直调用到最末端的派生类的构造函数。B.父类的构造函数只有一个带参数的构造函数:
无论派生类的构造函数带参数或是不带参数,都必须首先明确的调用super关键字以及合适的参数明确的调用基类的构造函数。
也就是说在调用基类的构造函数之前不能有任何东西。因为这样做会妨碍派生类的构造函数捕捉基类抛出的异常。
C.父类的构造函数中有带参数和不带参数的多个构造函数时
如果派生类的构造函数中不调用super(参数列表)来调用父类带参数的构造函数时,它会自动调用父类的不带参数的构造函数。
当然这时,派生类中可以定义带参数或不带数的构造函数。
子构造的时候要先构造父,同样父构造的时候要构造爷。你在子里调用super(i),它就会找父的带i的构造函数,但是找不到,所以上溯到父就失败。
也就是说子类里面隐含有父类的一个引用,然后一层层递归上去,你现在这个到父类就不行了。
对于每一个构造子,在初始化的时候都要执行父类的构造子
如果省略的话就是执行的默认super();
http://expert.csdn.net/Expert/topic/2678/2678097.xml?temp=.9209406