调用父构造函数Java

时间:2017-09-16 11:11:28

标签: java constructor

所以我试图制作一个java GUI计算器并开始想知道在一个类扩展另一个类的情况下是否会有所不同,在扩展类中调用super.functionname而不仅仅是functionname。

class frame extends JFrame{
       public buttonframe(){

        // any difference between this.add.. or super.add..

       }
}
然后我做了几个课程进行了一些实验,我找到了一些我不太了解的东西。

class A{
   public A(){
       System.out.println("A"); 
       h();
   }

   public void h(){    
       String className = this.getClass().getName();
       System.out.println(className); 
   }
}

class B extends A{
   public B(){   
       System.out.println("B");
       h(); 
   }   
}

跑步:

public static void main(String[] args){
   new A(); 
   new B(); 
}

产生输出:

> A calculator.A 
> A calculator.B
> B calculator.B

我知道扩展类会调用父类的构造函数,但是为什么它会生成结果计算器.B(虽然我不知道它为什么要这样做,但我假设A classname = new B();它与第二个输出行有关,而不是计算器。当它是从A类调用的构造函数时?

编辑:

class A{
public A(){
  //Can I instantiate a new B() and somehow ouput "A"?
 //I can do it using A.hs(); but can I do it: 

 //Using the method h() but with a specific keyword infront of h() so 
 //that it always refers to the method h() of the class A. 
 h(); 
}
public static void hs(){
 System.out.println("A"); 
}
    public void h(){
    System.out.println("A"); 
    }
}

class B extends A{
   public B(){
       h(); 
}
   public void h(){
    System.out.println("B"); 
   }
}

1 个答案:

答案 0 :(得分:1)

结果是因为声明:

String className = this.getClass().getName();

当调用this时,当前对象(new B())为B,因此类名为B

因此,您的案例中的完整序列将是:

A() => prints A => call h()  with current object of 'A' => prints classname of A

B() => calls super c'tor A()  => prints A => call h() with object of 'B' 
    => prints classname of B => prints B => call h() => prints classname of B