问题描述
- 一个JAVA苦手的关于类的问题
-
public class Animal{
public Animal(){
}
public void cry(){
System.out.print("crying");
}
}
其中为什么还要再加上public Animal(){ }这一行代码?
解决方案
创建一个子类对象的实例的时候,必先调用父类的无参构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统不会给他创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器会报错,如果在子类的构造函数中指定使用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数的时候,就不会报错了。
我们假设A是B的父类,B是A的子类。
1、如果没有给A类没有提供构造函数,则编译器会自动提供一个默认的构造函数,如果用户提供了自己的构造函数,则编译器不提供默认的构造函数。
2、子类B实例化时会自动调用父类的构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供其他的构造函数,编译器同样报错,因为找不到A的默认无参数构造函数。所以我们编程中最好给一个默认的构造函数。
3、或者在B的构造函数中显示的调用父类A的有参构造函数。super(parameter
解决方案二:
可以不加,默认会有这个构造函数。
解决方案三:
声明一下构造函数是公有的,只有这些代码看不出用途。在有类继承它的时候,才有作用。
解决方案四:
如楼上所说,创建一个子类对象的实例的时候会先调用父类的无参构造函数,如果没有显示的生命的话,系统会默认生成一个。但是当父类中你声明了一个有参数的构造方法,系统就不会生成这个无参的构造方法,这样在子类继承后,穿件对象时就会因为找不到无参构造函数而报错。所以显示的声明无参构造函数是一个好习惯,尽管有时肯能没有什么卵用。求关注。
解决方案五:
这个叫无参构造函数。如果不写也没关系。系统会默认一个无参构造
解决方案六:
每个累都有默认一个没有参数的构造方法,就算你没有写,他其实也是存在的。
解决方案七:
下次记得把有子类说清楚,这样就好解释了。
单独的这个类是没有问题的,不谢无参数构造函数也没事,但是有了继承类,继承类创建实例的时候,因为需要调用父类的无参构造函数所以需要在父类里声明。
看了你的评论,你的子类中应该是有这样一行的:
Dog dog = new Dog();
这个实例因为调用了Dog类的无参数构造函数,需要你声明无参数构造函数Dog,不加会报错,你的Dog类里应该没有有参数的Dog构造函数;
同样,因为你使用了上面的代码,Dog继承了Animal,在构造实例的时候需要调用父类的无参构造函数,如果父类中没有显示声明,会报父类的错。
解决方案八:
无参构造,可以不加,系统会自动配备,但是如果有有参构造函数了,就必须添加无参构造的,至于为啥,我还真是,,说不出来,,话说你知道么= =
解决方案九:
是构造函数,不加,也可以。那是用默认构造函数
解决方案十:
是无参构造器。
public Animal( String param){ // 有参构造器 (带参数 param)
……
}
如果没有 有参构造器的话 ,有没有是一样的,会有无参构造器(默认);
如果有 有参的构造器的话,如果没有写无参的构造器的话,就没有无参的构造器。(不再默认有无参的构造器)。