您的位置:首页 > 编程语言 > Java开发

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

2015-02-20 02:38 155 查看
在读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;
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: