我在一本介绍java基础的书上看到这样的描述----
1.构造函数不能像其他超类的方法那样被继承。
2.Java不会为子类创建不带参数的缺省构造函数
如:
class Fruit { public Fruit ( String color ) { System.out.print ( “color = ” + color ) ; }}class Apple extends Fruit { public static void main ( String [ ] args ) { Apple m = new Apple () ; }}
运行这个程序,结果会报错.
这两个说法是否正确?另外,假使正确的话,在子类中就只有自己写(而起必须写)构造函数了(因为按上述说法,子类中不会存在默认的构造函数)
而实际运用中我觉得并不是如此
1.构造函数不能像其他超类的方法那样被继承。
2.Java不会为子类创建不带参数的缺省构造函数
如:
class Fruit { public Fruit ( String color ) { System.out.print ( “color = ” + color ) ; }}class Apple extends Fruit { public static void main ( String [ ] args ) { Apple m = new Apple () ; }}
运行这个程序,结果会报错.
这两个说法是否正确?另外,假使正确的话,在子类中就只有自己写(而起必须写)构造函数了(因为按上述说法,子类中不会存在默认的构造函数)
而实际运用中我觉得并不是如此
而子类中的构造方法默认调用父类中的构造方法
如果Apple类中构造方法里没有显示的调用父类中被重载的构造方法
则会报错
因为找不到父类中的哪个默认的哪个构造方法
2.Java不会为子类创建不带参数的缺省构造函数
这两个说法是对的
只要把类Apple中加个无参构造函数就好了
Apple(){}
因为构造函数不能被子类继承所以有super这个东西而Java又不会为子类创建不带参数的缺省构造函数所以当不是从Object继承的子类
是不会有默认构造函数的所以要Apple m = new Apple () ;这句话成立必须加个无参构造函数
加个无参构造函数函数是可以!但是你加的这个构造函数就不对了:Apple(){}
当你在一个class中有有参构造函数后,系统是不会默认帮你加无参构造函数的。除非你自己加,
当父类中没有无参构造函数时,子类中是不会自动调用父类中的构造函数的(原因很简单它不知调用那个),所以我们要ziji通过super()来显示调用。
那么我们再来看看这个:
class Fruit { public Fruit ( String color ) { System.out.print ( “color = ” + color ) ; }
中没有无参构造函数所以Apple(){}是不能编译的。
解决方法一 在Fruit 中加个无参构造函数或者在Apple(){}该位
Apple()
{
super(“color ”);
}