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

解决方案 »

  1.   

    老师说的是父类无参的构造方法也调用了,但是调用时只实现赋值,没有实现输出语句,
    我想问一下
    子类在没有super调用父类有参构造方法的的条件下 子类有没自动调用父类的有参和无参构造方法、、
    子类在有super调用父类有参构造方法的条件下  子类有没自动调用父类的有参和无参构造方法、、
      

  2.   

    this 是指当前对象
    new Circle()首先调用父类构造方法,由于当前对象 circle1的类型为Circle,this.toString()调用的是Circle类的toString()方法
    由于Circle中的toString()中的super.toString(),结果又调用父类的toString(),至此父类构造方法执行完毕
    接下来执行子类构造方法,调用子类的toString()又进行一次输出
      

  3.   

    这是个多态问题
    子类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(); 
      } 
      

  4.   

    this 也能多态,又长见识了。
      

  5.   

    其实首先要知道 类的default构造函数,是系统防止未初始化变量,就使用整出来的.如果我们自己显示的定义了一个构造函数的话,系统会认为我们已经知道要初始化了,所以它 就不管了,然后那个系统自动的default构造函数就没有!
    然后在子类中 如果父类存在无参构造函数则不需要我们显示的用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
      

  6.   

    你明白我就不说了,本来想给你讲一下,这是JAVA的运行期内检查机制,如果加上static 你又要模糊了,你自己试试.
      

  7.   

    this指针貌似没多态
    汗```````````