理解 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 是在一个类创建的时候,用户创建类实例的时候被调用的特殊函数。它不是一个类的成员函数,它只能代表这个类本身。
不可以创建一个继承的子类时,用父类的构造方法创建子类。
例如:上面一个继承关系的类。对于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的函数。
所以,编译器如果要构造一个类,必须要有和类名字相同的构造函数才可以。
也就是说,构造函数是用来造唯一的东西的。不能用一个构造函数即造爸爸,又造儿子。这样身份就乱了。
下面的代码是合法的代码,从下面的代码可以看出来,构造函数不是一个成员函数。
如果我们在类中再增加下面一个函数,编译器会报 Duplicate method Father() in type Father 错误,原因是两个成员函数发生了冲突。
这里有一句是讲,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; }
相关文章推荐
- 理解 Java 构造函数不可以继承
- java 静态内部类不可以继承非静态内部类理解
- 对Java不能多继承,只能单继承,却可以实现多个接口的理解
- Java 构造函数不可以继承,因此不能被重写,但可以被重载
- JAVA 子类继承父类的构造函数的重载
- java基础语法、继承与重载、super、static、finally、String与StringBuffer的深入理解
- java 继承类 变量、静态变量、构造函数执行顺序
- Java继承时构造函数的调用
- JAVA 继承 构造函数的执行顺序
- java/构造函数,函数的重载,this的运用,构造函数的重载,静态函数,静态初始化,import,对象的继承,
- Java的块,静态块,构造函数,继承的执行先后顺序
- 温习Java笔记(5):构造函数、继承和多态
- java 抽象类可以继承实体类?
- java 继承类 变量、静态变量、构造函数执行顺序
- Java继承构造的深入理解
- Java中构造函数的权限可以是private吗?为什么
- Java -- 一条关于继承构造函数的题目
- JAVA中几个易混淆关键词的理解:行为,隐藏,组合和继承,覆写和重载,多形(多态)性,动态绑定,上溯造型,抽象类,接口
- Java中关于构造函数继承的相关问题
- java中子类继承父类时是否继承构造函数