2014-02-28 173 views
-1

当我尝试创建B类型对象时,下面的代码给出错误。我的问题是为什么不是A的默认构造函数被调用?通过子类构造函数隐式调用默认构造函数

class A 
{ 
    private int a; 

    A(int a) 
    { 
    this.a = a; 
    System.out.println("This is constructor of class A"); 
    } 
} 

class B extends A 
{ 
    private int b; 
    private double c; 

    B(int b, double c) 
    { 
    this.b = b; 
    this.c = c; 
    System.out.println("This is constructor of class B"); 
    } 
} 
+0

这是基本的基本Java 101,在这里发布之前,您应该努力学习使用教程和其他资源。请阅读[FAQ]和[Ask]了解StackOverflow的用途和范围。提示:它的目的是作为解决实际问题的长期资源,而不是获得基本的教程指导。关于SO的问题和答案旨在对未来的搜索者有用,因此复制这种类型的信息几乎没有长期价值。 –

回答

2

我的问题是,为什么没有一个默认的构造器叫什么名字?

因为没有一个。当你提供你自己的参数化构造函数时,编译器不会添加默认的构造函数。所以,你似乎在想的类A有一个0-arg构造函数,没有。你必须明确添加一个。

+0

你能解释为什么我写'B b1 = new B(10,8.6);' ?是因为编译器试图找到'A()'构造函数,但超类中没有任何构造函数。 –

+0

@SalmanAnjum是的。 –

0

A的默认构造函数意味着新的A()。您没有可用的构造函数,这意味着构造A的唯一方法是调用新的A(int)。由于没有默认构造函数B必须显式调用A的超级构造函数来正确初始化A.

0

因为只有在Java中没有构造函数时调用默认构造函数。

0

当您定义自己的构造函数时,java编译器不再自动插入默认构造函数。

在你的代码中,当构造B时,第一行隐式调用超类构造器。​​尽管由于您已经重写了A的默认构造方法,因此编译器不会自动使用必要参数自动调用超类构造函数,所以不存在构造函数调用。您应该在B构造函数的第一行添加一行,以便使用它需要的int参数调用A的超类构造函数,或者为A定义构造函数,类似于不带参数的默认构造函数。

您可以重载构造函数,以便一个构造函数像默认构造函数一样是无参数的,然后有其他构造函数接受参数。 :d

这方面的一个例子如下,根据您的代码:

class A 
{ 
private int a; 

A(int a) 
{ 
    this.a =a; 
    System.out.println("This is constructor of class A"); 
} 

//overload constructor with parameterless constructor similar to default 
A() { 
    System.out.println("this is like a default no-args constructor"); 
} 
} // end class A 

class B extends A 
{ 
private int b; 
private double c; 

    // add in another constructor for B that callers can use 
    B() { 
     int b = 9; 
     System.out.println("new B made in parameterless constructor"); 

    } 

    B(int b,double c) 
    { 
    super(b); // this calls class A's constructor that takes an int argument :D 
    this.b=b; 
    this.c=c; 
     System.out.println("This is constructor of class B"); 
    } 
} // end class B 
0

尝试在扩展类的构造函数添加引用父类的构造函数即

class B extends A 
{ 
private int b; 
private double c; 
B(int b,double c, int superVal) 
{ 
super(superVal); 
this.b=b; 
this.c=c; 
System.out.println("This is constructor of class B"); 
} 
} 
0

默认构造函数是一个不包含任何参数的构造函数。如果没有这样的默认构造函数,编译器会创建一个构造函数,前提是没有其他可用的参数化构造函数。

在这个例子中,因为有一个可用的参数化构造函数,所以编译器不会创建一个默认构造函数。由于没有可用的默认/无参数构造函数,所以会导致编译错误