理解 Java 构造函数不可以继承

在读Java的文档的时候  http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

这里有一句是讲,Constructors 不是成员函数,所以它不可以被继承。但是他可以被调用。

“A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.”


我们怎样理解这个问题呢?

Constructors 是在一个类创建的时候,用户创建类实例的时候被调用的特殊函数。它不是一个类的成员函数,它只能代表这个类本身。

不可以创建一个继承的子类时,用父类的构造方法创建子类。

public class main {
	public static void main (String[] arg){
		Son s = new Son ();  // code 1
	}
}

class Father{
	public Father (){
		System.out.println("Father Construtor");
	}
	
	public Father (int x){
		System.out.println("Father Construtor " + x);
	}
	
	public void Father (){
		System.out.println("Father member function");
	}
}

class Son extends Father { 
	public Son (){
		super(1);
		System.out.println("Son Construtor");
	}
	
	public void Father(){
		System.out.println("Inherited Father member function.");
		super.Father();
	}
}

例如:上面一个继承关系的类。对于code 1处。

我们如果在创建子类的时候,使用父类的构造方法,我们需要写成这样。

Son s = new Father ();

这时候,编译器会报“Type mismatch: cannot convert from Father to Son” 错误。


如果我们进行强制转换,如下:

Son s = (Son)new Father ();

这时候,编译器无法发现有什么错误,但是运行的时候会抛出下面异常。

Exception in thread "main" java.lang.ClassCastException: Father cannot be cast to Son at main.main(main.java:4)

父类无法转换成子类。其本质上,创建的仍是一个父类。


如果在Son类中,增加父类constructor的函数。

public Father (){
	
}
去尝试重载父类constructor,编译器会报错。 

所以,编译器如果要构造一个类,必须要有和类名字相同的构造函数才可以。

也就是说,构造函数是用来造唯一的东西的。不能用一个构造函数即造爸爸,又造儿子。这样身份就乱了。


下面的代码是合法的代码,从下面的代码可以看出来,构造函数不是一个成员函数。

class Father{
	public Father (){
		System.out.println("Father Construtor");
	}
	
	public Father (int x){
		System.out.println("Father Construtor " + x);
	}
	
	public void Father (){
		System.out.println("Father member function");
	}
}
编译器不会对上面的代码报成员函数冲突错误。因为Constructor不是一个成员函数。

如果我们在类中再增加下面一个函数,编译器会报 Duplicate method Father() in type Father 错误,原因是两个成员函数发生了冲突。

	public int Father (){
		System.out.println("Father member function");
<span style="white-space:pre">		</span>return 1;
	}






  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值