java语言基础(33)——面向对象(父类中没有无参构造编译报错——无法将类 xxx中的构造器 xxx应用到给定类型 实际参数列表和形式参数列表长度不同)

原创 2017年03月30日 23:39:16

注意:以下代码是错的。

class Father
{
	public Father(String name){
	  System.out.println("Father带参构造");
	}
}
class Son extends Father
{
	 public Son(){
	  System.out.println("Son无参构造");
	 }
	 public Son(String name){
	  System.out.println("Son带参构造");
	 }
	 
}

class ExtendsDemo
{
 public static void main(String[] args){
   Son s = new Son();
   System.out.println("----------");
   Son s1 = new Son("小明");
 }
}
原因分析:

1 当类没有给出构造方法时,java会默认给出无参构造。而Father给出了带参构造

public Father(String name){ }

系统就不会再给无参构造。

2 子类的构造方法其实第一句都默认是super(); 是调用父类的无参构造。而此时父类没有无参构造,只有带参构造,所以报错原因为:实际参数列表和形式参数列表长度不同,可不是嘛,父类只有带参构造,而你调用无参构造。

解决方案:

1 给父类定义一个无参构造。

2 显式的调用父类其它构造方法。必须放在子类构造方法中的第一句。

其实,并不是一定要调用父类的无参构造的。调用父类的其它构造也是可以的。因为继承父类要对父类进行初始化,我们没有手动初始化父类,java为了避免在用到父类中数据时,父类对象还不存在,所以就在子类构造中隐式地调父类无参构造来对父类初始化。也就是我们说的,子类构造方法中第一句默认都为:super();

当父类没有无参构造方法时,我们就可以显式地调用父类的其它构造方法。上例中我们可以在子类构造的第一句写

super("名字随意"); // 参数值就无所谓了,只要类型,个数对应就行。


版权声明:本文为博主原创文章,转载请注明出处,以便当内容有变动时别人能找到原文,避免误导大家。

c++构造函数成员初始化中赋值和初始化列表两种方式的区别

先总结下: 由于类成员初始化总在构造函数执行之前 1)从必要性:      a. 成员是类或结构,且构造函数带参数:成员初始化时无法调用缺省(无参)构造函数      b. 成员是常量或引用:...
  • zizi7
  • zizi7
  • 2016年08月31日 11:26
  • 5391

Java构造函数 为什么需要无参构造函数

Java构造函数 为什么需要无参构造函数  分享| 2013-05-08 16:20匿名 | 浏览 3298 次  java编程语言函数 class cust { int a...
  • evilcry2012
  • evilcry2012
  • 2015年12月24日 11:04
  • 3778

C++类构造函数初始化列表,子类向父类传参数

C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { ...
  • linking530
  • linking530
  • 2014年10月30日 11:59
  • 3395

黑马程序员——Java语言基础:面向对象、封装(构造函数、设计模式)

------Java培训、钱柜娱乐开户培训、iOS培训、.Net培训、期待与您交流! -------  一、理解面向对象 面向对象和面向过程都是一种思想,面向对象是相对面向过程而言...
  • ls_promise
  • ls_promise
  • 2015年09月23日 11:25
  • 435

对象及内存管理——父类构造器

2、 父类构造器        当创建任何Java对象时,程序总会先依次调用每个父类的非静态初始化块、构造器(总是从Object类开始)执行初始化,然后才调用本类的非静态初始化块、构造器执行初始化过程...
  • Never_Blue
  • Never_Blue
  • 2017年04月07日 11:16
  • 147

JAVA经典继承与父类调用 geter、seter访问器 构造器

  • 2009年07月29日 19:21
  • 1KB
  • 下载

java学习笔记9——调用父类构造器

在一个构造器中调用另一个重载的构造器使用this调用来完成,在子类构造器中调用父类构造器使用super调用来完成。 class Base{ public double size; pub...
  • whaixhcx
  • whaixhcx
  • 2014年01月20日 15:21
  • 409

java基础第四讲——数组、字符串、类与对象(构造器)

目录数组 字符串 类与对象数组一维数组 冒泡排序 多维数组 定义:一组相同的数据构成的数据 一维数组数组的声明: 数据类型 变量名; int[] array1 = new int[大小...
  • Went_Gone
  • Went_Gone
  • 2015年07月30日 20:18
  • 394

黑马程序员_Java基础_面向对象(继承、子父类变量和函数以及构造函数特点、final关键字、抽象类、模版方法模式、接口)

------- 钱柜娱乐开户培训、java培训、期待与您交流! ---------- 一、面向对象(继承) 继承: 1.提高了代码的复用性。 2.让类与类之间产生了关系。有了这个关系,才有了多态...
  • yangcheng91
  • yangcheng91
  • 2012年08月02日 19:35
  • 1244

人员类 c++(构造函数 复制构造函数 缺省参数列表)

  • 2010年10月29日 07:19
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java语言基础(33)——面向对象(父类中没有无参构造编译报错——无法将类 xxx中的构造器 xxx应用到给定类型 实际参数列表和形式参数列表长度不同)
举报原因:
原因补充:

(最多只允许输入30个字)