java子类的构造函数
① 关于java中子类继承父类的构造方法
java继承中对构造函数是不继承的,只是调用(隐式或显式)。
举例说明:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
编译后执行结果如下:
分析:SonClass s = new SonClass(66);执行这句时,调用
public SonClass(int c) {
System.out.println(1234);//系统会自动先调用父类的无参构造函数(super())
}
在这个构造函数中,等价于
public SonClass(int c) {
super();//必须是第1行,否则不能编译
System.out.println(1234);
}
所以结果是 100 1234
3.如果子类构造函数是这样写的
public SonClass(int c) {
super(22);//必须是第1行,否则不能编译
//显式调用了super后,系统就不再调用无参的super()了;
System.out.println(1234);
}
执行结果是 22
1234
总结1:构造函数不能继承,只是调用而已。
如果父类没有无参构造函数
创建子类时,不能编译,除非在构造函数代码体中第一行,必须是第一行显式调用父类有参构造函数
如下:
SonClass (){
super(777);//显示调用父类有参构造函数
System.out.println(66);
}
如果不显示调用父类有参构造函数,系统会默认调用父类无参构造函数super();
但是父类中没有无参构造函数,那它不是不能调用了。所以编译就无法通过了。
总结2:创建有参构造函数后,系统就不再有默认无参构造函数。
如果没有任何构造函数,系统会默认有一个无参构造函数。
② java子类的构造函数...
父类少了个无参构造方法。或者在子类的构造方法中改一下
fish(String n,int s){//子类fish的构造函数
super(n);
swimspeed=s;
}
③ java创建父类对象可以用子类构造函数why
子类继承父类的数据和方法,子类对象当然也属于父类的类型,
不管父类或子类,静态成员总是在new创建对象之前执行
子类继承父类的构造方法的原则:一般JVM先调用子类的构造函数,
第一种情况:若子类构造函数开始没有显示调用父类构造函数,则自动调用父类那个无参构造函数。若已显示调用了,则调用显示调用的构造函数,而不再调用父类其它的构造函数。
第二种情况:在没有显示调用的情况下,若父类中无构造函数,则调用父类默认的构造函数。若父类中有构造函数而没有无参的构造函数,编译时会报错。
多态性,是编译引用变量时,无法确定其调用的是哪个类的方法,只能在程序运行期间,才能确定引用变量调用的具体类的方法,与创建父类和子类对象无关哟
④ java中的构造函数有什么用用它有什么好处在什么地方用
构造函数是类的一个特殊方法,这个方法用来生成实例时由系统自动调用,程序员无法直接调用。构造函数方法名同类名相同且参数为空。子类继承父类后默认继承父类的构造函数,即:子类存在隐含方法:super(),如果子类重写构造函数则子类也隐含调用super()。
如下例:
例一:
package sample;
public class A{
A(){
System.out.println("主类构造函数调用");
}
public static void main(String args[]){
A g=new A();
subA s=new subA();
}
}
class subA extends A{
}
执行结果为:
主类构造函数调用
主类构造函数调用
本例中子类subA中没有任何方法,所以隐含调用super(),super()指向A()。
例二:
package sample;
public class A{
A(){
System.out.println("主类构造函数调用");
}
public static void main(String args[]){
A g=new A();
subA s=new subA();
}
}
class subA extends A{
public subA(){
}
}
执行结果为:
主类构造函数调用
主类构造函数调用
本例中子类subA只有一个空方法suba()中没有任何方法,所以也隐含调用super(),super()指向A()。
例三:
package sample;
public class A{
A(){
System.out.println("主类构造函数调用");
}
public static void main(String args[]){
A g=new A();
subA s=new subA();
}
}
class subA extends A{
public subA(){
System.out.println("子类构造函数调用");
}
}
执行结果为:
主类构造函数调用
主类构造函数调用
子类构造函数调用
本例中子类subA的方法subA()虽然后输出但同上例中相同都为构造函数,所以也隐含调用super(),super()指向A()。
⑤ JAVA中 子类与父类构造方法的关系 个人理解
编写JAVA作业时在继承的环节发现了一些错误,希望总结一些规律:(以下全部属于自己归纳,可能有问题)
一句话概括就是:子类一定会调用(不是继承)父类的构造方法!
即遵循一个原则:子类的构造一定是在父类已构造的基础上!
这句话要分为几种情况来理解(下面只讨论父类有构造函数):
子类构造函数自动调用super() (也可以手动加上)
但如果父类只有含参数的构造方法,那么子类必须申明一个构造方法,其中包含对super(args)的调用
一、父类含有无参构造函数
1、子类没有构造方法或者含有无参的构造方法:
这种情况,都会默认地调用super()
2、子类含有有参数构造方法:
同样会在首句默认调用super() //其实跟情况1类似
二、父类含有含参数的构造方法,不含无参数的构造方法:
子类没得选择:
子类必须申明一个构造方法(且含super的args),且方法里要首先调用super(args),否则报错。
三、父类含 含参数的构造方法和无参的构造方法:
此时子类可以选择性调用:
可以无构造方法:仍会默认调用super()
也可以有构造方法:其中会默认地调用super(),你也可以在开头加上这句,如果你不希望调用父类默认的无参方法,那么在 子类构造方法 中调用 父类含参构造方法。
上述看似情况复杂,其实基于其原则理解并不难。
综上:java为了保持 子类的构造基于父类的构造 这一原则,子类构造时必须通过某些方式首先调用父类的构造方法,否则会报错。
⑥ java继承中构造函数的调用顺序
首先是在main函数里面,jvm发现了程序建立了一个Sanwich的对象,于是jvm便会到Sanwich里面找到构造函数构造一个Sanwich对象。但是jvm发现Sanwich是PortableLunch的子类,所以jvm会要先构造PortableLunch的对象。可是PortableLunch类又是Lunch的子类,所以jvm会要去构造Lunch对象。同理,Lunch又是Meal的子类,因而jvm会要构造Meal的对象。之后jvm会依照Meal、Lunch、PortableLunch、Sanwich的层次结构逐级构造出Sanwich对象,从而打印出Meal()、Lunch()、PortableLunch()、Sanwich()。但是由于Sanwich类中有Bread、Cheese、Letter三个变量,如果你没有他们实例化的话,那么程序就此结束;可是你给这三个变量实例化了,因此Sanwich在调用构造函数Sanwich()之后,回过头来处理这三个实例化了的变量。所以程序又会打印出Bread()、Cheese()、Letter().
⑦ java,中的子类继承父类,子类如何调用父类的构造函数举一个简单的例子加注释说明
子类无条件调用父类的无参构造函数,实例:
父类:
package com.test;
public class TestFatherClass {
private String name="abc";
TestFatherClass(){
System.out.println("1、这是父类的无参构造函数");
}
TestFatherClass(String a){
System.out.println("2、这是父类的有参构造函数");
}
}
子类:
package com.test;
public class TestChildClass extends TestFatherClass{
TestChildClass(){
System.out.println("3、这是子类的无参构造函数");
}
TestChildClass(String str){
System.out.println("4、这是子类的有参构造函数");
}
public static void main(String[] args) {
System.out.println("实例化对象时:(无参)");
TestChildClass test = new TestChildClass();
System.out.println("实例化对象时:(有参)");
TestChildClass test2 = new TestChildClass("adad");
}
}
输出结果:
⑧ java中只要调用子类的构造函数就要调用父类无参数的构造函数吗若父类中不存在无参数构造函数会出错吗
Q1.java中只要调用子类的无参构造函数就要调用父类无参数的构造函数! Q2.也不一定。 e.g 如果你子类只调用无参构造方法(没有调用多个参数的构造方法),那么父类的无参构造方法则可有可无,因为系统会帮你生成。 你应该知道,如果子只类定义了一个带有参数的构造方法,那么系统就不会帮你生成无参构造方法。父类也是如此。 因为你父类定义了带参的构造方法,所以系统不会帮你生成无参构造方法,而你子类调用父类无参构造方法的时候就会提示父类没有无参构造方法。会报错的!
⑨ java 子类的构造函数都必须要super();吗
不是必须的,在构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参数的构造函数,或这个函数被私有化了(用private修饰).此时你必须加入对父类的实例化构造.而this就没有这个要求,因为它本身就进行实例化的构造.