class Point
{
protected int x, y;
public Point()
{
x=0;
y=0;
System.out.println( "Point constructor: "+"A1"+this.toString()+"A2" );
}
public Point(int a,int b)
{
x=a;
y=b;
System.out.println( "Point constructor: "+"B1"+this.toString()+"B2" );
}
public String toString()
{
return "["+x+","+y+"]"+"C1";
}
}
class Circle extends Point
{
protected double radius;
public Circle()
{
super(4,5);
radius=10;
System.out.println( "Circle constructor: "+"D1"+this.toString()+"D2" );
}
pu {
return "Center = "+"E1"+super.toString()+"E2"+"Radius="+radius+"E3";
}blic String toString()
}
public class TestConstruc
{
public static void main( String args[] )
{
Circle circle1=new Circle();
}
} 请人帮忙看一下这代码、、
老师讲的和理解的不一样、
运行结果是:
Point constructor: B1Center = E1[4,5]C1E2Radius=0.0E3B2
Circle constructor: D1Center = E1[4,5]C1E2Radius=10.0E3D2
{
protected int x, y;
public Point()
{
x=0;
y=0;
System.out.println( "Point constructor: "+"A1"+this.toString()+"A2" );
}
public Point(int a,int b)
{
x=a;
y=b;
System.out.println( "Point constructor: "+"B1"+this.toString()+"B2" );
}
public String toString()
{
return "["+x+","+y+"]"+"C1";
}
}
class Circle extends Point
{
protected double radius;
public Circle()
{
super(4,5);
radius=10;
System.out.println( "Circle constructor: "+"D1"+this.toString()+"D2" );
}
pu {
return "Center = "+"E1"+super.toString()+"E2"+"Radius="+radius+"E3";
}blic String toString()
}
public class TestConstruc
{
public static void main( String args[] )
{
Circle circle1=new Circle();
}
} 请人帮忙看一下这代码、、
老师讲的和理解的不一样、
运行结果是:
Point constructor: B1Center = E1[4,5]C1E2Radius=0.0E3B2
Circle constructor: D1Center = E1[4,5]C1E2Radius=10.0E3D2
我想问一下
子类在没有super调用父类有参构造方法的的条件下 子类有没自动调用父类的有参和无参构造方法、、
子类在有super调用父类有参构造方法的条件下 子类有没自动调用父类的有参和无参构造方法、、
new Circle()首先调用父类构造方法,由于当前对象 circle1的类型为Circle,this.toString()调用的是Circle类的toString()方法
由于Circle中的toString()中的super.toString(),结果又调用父类的toString(),至此父类构造方法执行完毕
接下来执行子类构造方法,调用子类的toString()又进行一次输出
子类Circle重写了父类Point的toString()方法
子类无参的构造函数调用父类的 Point(int a,int b)时执行System.out.println( "Point constructor: "+"B1"+this.toString()+"B2" ); 的时候其实调用的是子类的toString()方法
所以会出现你上面的结果
此时的this是父类引用指向了子类的对象,很隐蔽的多态问题.
你看看下面的代码是不是你想要的class Point
{
protected int x, y;
public Point()
{
x=0;
y=0;
System.out.println( "Point constructor: "+"A1"+toMyString()+"A2" );
} public Point(int a,int b)
{
x=a;
y=b;
System.out.println( "Point constructor: "+"B1"+toMyString()+"B2" );
}
public String toMyString()
{
return "["+x+","+y+"]"+"C1";
}
}
class Circle extends Point
{
protected double radius;
public Circle()
{
super(4,5);
radius=10;
System.out.println( "Circle constructor: "+"D1"+this.toString()+"D2" );
}
public String toString() {
return "Center = "+"E1"+toMyString()+"E2"+" Radius="+radius+"E3";
}
} public class TestConstruc
{
public static void main( String args[] )
{
Circle circle1=new Circle();
}
}
然后在子类中 如果父类存在无参构造函数则不需要我们显示的用super(),编译器也会去调用父类的无参构造函数(哪怕这个构造函数是我们自己写的,不是系统自动的default构造函数).如果系统没有 无参构造函数则需要我们显示的用super语句来指明调用父类的哪个构造函数.在子类中 没有super 而且 父类没有自己写的构造函数 或者父类有自己写的无参构造函数的时候 ,这两种情况下 会自动调用父类的无参构造函数
class TestFather{
public TestFather(){
System.out.println(" father");
}
public TestFather(int i){
System.out.println(" father");
}
}class TestSon extends TestFather {
public TestSon (){
System.out.println("son");
}
}
public class Test { public static void main(String[] args) {
new TestSon();
}
}
输出是
father
son
汗```````````