当前位置:编程学习 > JAVA >>

为什么子类调用超类构造函数直接super()就可以,而不super.constructor()

目前正在学习《JAVA大学教程》
关于子类调用超类构造函数有点困惑,希望大牛们能为我这个初入JAV的学徒解答一下,谢谢!
问题是:书中说子类通过在超类名前加上super.的方式来访问超类的方法。既然如此,调用超类的构造函数也应该如此吧。但是例子却是直接在子类的构造函数中用super()来调用超类的构造函数。
我自己在代码中用super.Point()来测试如注释,编译提示如下:
1)无法将类Point中的构造器Point应用到给定类型
需要:double, double
找到:没有参数
原因:实际参数列表和形式参数长度不同
2)找不到符号super.Point(0, 0);



代码如下:

//Point.java

public class Point
{
protected double x, y;

public Point( double a, double b )
{
setPoint( a, b );
}

public void setPoint( double a, double b )
{
x = a;
y = b;
}

public double getX() 
{
return x;
}

public double getY() 
{
return y;
}

public String toString()
{
return " [ " + x + ", " + y + " ] ";
}
}

//Circle.java

public class Circle extends Point
{
protected double radius;
protected final double PI = 3.14159;

public Circle()
{
super( 0, 0 ); //子类调用超类的构造函数,为什么不是super.Point( 0, 0 )呢? setRadius( 0 );
}

public Circle( double r, double a, double b )
{
super( a, b );
setRadius( r );
}

public void setRadius( double r )
{
radius = ( ( r > 0.0 ) ? r : 0 );
}

public double getRadius()
{
return radius;
}

public double Area( double r ) 
{
return PI * Math.pow( radius, 2 );
}

public String toString()
{
return " Center = " + " [ " + x + ", " + y + " ] " + " ; Radius = " + radius;
}
}

//Hello.java
import java.awt.Graphics;
import java.applet.Applet;


public class Hello extends Applet
{
private Point pointRef, p;
private Circle circleRef, c;


public void init()
{
p = new Point( 2.1, 3.4 );
c = new Circle( 4, 3.2, 5.4 );
}

public void paint( Graphics g )
{
g.drawString( " Point p: " + p.toString(), 25, 25 );
g.drawString( " Circle c: " + c.toString(), 25, 45 );

pointRef = c;
g.drawString( " PointRef c via pointRef: " + pointRef.toString(), 25, 65 );

pointRef = c;
circleRef = ( Circle ) pointRef;
g.drawString( " CircleRef via circleRef: " + circleRef.toString(), 25, 85 );

}
} --------------------编程问答-------------------- 没什么,这是规则。。。 --------------------编程问答-------------------- 构造方法或者构造函数(Constructor ,个人理解构造器更适合) 和 方法不是同一个概念的 子类创建对象的时候肯定会调用父类的构造器的,默认子类的构造方法会有super();如果父类有重写的构造器,则 可以手动添加super(ref,ref1),而且必须在构造器使用。super.field  或者super.method() 可以理解super为父类对象。"."一般都是表示对象调用成员变量或者成员方法。构造方法不是方法。 --------------------编程问答--------------------
引用 2 楼 liangpeng411 的回复:
构造方法或者构造函数(Constructor ,个人理解构造器更适合) 和 方法不是同一个概念的 子类创建对象的时候肯定会调用父类的构造器的,默认子类的构造方法会有super();如果父类有重写的构造器,则 可以手动添加super(ref,ref1),而且必须在构造器使用。super.field  或者super.method() 可以理解super为父类对象。"."一般都是表示对象调用成员变量……
 java中没有函数,只有方法、构造方法 --------------------编程问答-------------------- 就是一系列规则而已,就像c++中,你可以直接在冒号后面的初始化式中调用基类构造函数一样,没为什么 --------------------编程问答-------------------- super是子类里的父类信息,你调用的super.Point(x,y);这个时候,你的super还没有初始化了~~

构造函数里执行super();就是直接初始化父类呢。

个人理解~~~ --------------------编程问答--------------------
引用 2 楼 liangpeng411 的回复:
构造方法或者构造函数(Constructor ,个人理解构造器更适合) 和 方法不是同一个概念的 子类创建对象的时候肯定会调用父类的构造器的,默认子类的构造方法会有super();如果父类有重写的构造器,则 可以手动添加super(ref,ref1),而且必须在构造器使用。super.field 或者super.method() 可以理解super为父类对象。"."一般都是表示对象调用成员变量或者……

默认调用的都是直接的父类的构造函数么?假设多重继承,是否可能会调用直接父类的父类的构造函数呢? --------------------编程问答--------------------
引用 4 楼 ticmy 的回复:
就是一系列规则而已,就像c++中,你可以直接在冒号后面的初始化式中调用基类构造函数一样,没为什么

默认调用的都是直接的父类的构造函数么?假设多重继承,是否可能会调用直接父类的父类的构造函数呢?
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,