关闭

java 构造函数的解析

43人阅读 评论(0) 收藏 举报


java构造方法其实也是一种特殊的方法:
1.构造方法名必须和类名相同
2.构造方法没有返回值,不能定义为void类型
3.一个对象可以有多个构造方法,也可以没有构造方法,假如没有则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
4.构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
对于这些都是没有问题的,关键是加入继承关系后的构造函数的调用问题。
1.子类只继承父类的默认构造方法,即无形的构造方法,如果没有则不继承。
2.子类从父类继承的默认构造方法不能成为子类的默认构造方法。
3.如果子类想调用父类的非默认构造函数,则必须使用super来实现。
4.创建子类对象时,子类必须调用父类的构造函数。可以通过系统自动调用父类的默认构造函数,如果父类没有默认构造函数时,子类构造函数必须通过super调用父类的构造函数。
其实最关键的也是容易产生困惑的,就是调用的第4条。当我请求创建子类对象时,先会调用父类的构造方法,如果父类有默认的构造方法,则会调用父类的默认构造方法。
如果没有,则必须通过super调用父类的构造函数。
public class Person {
    public Person(){
        System.out.println("Person initialized");
    }
    public Person(String str){
        System.out.println("Person initialized"+str);
    }
}

public class Chinese extends Person {

    public Chinese() {
        System.out.println("Chinese initalized");
    }

    public Chinese(String str) {
        System.out.println("Chinese initialized " + str);
    }
}
当我们 Chinese ch= new Chinese("wo");的时候:
Person initialized
Chinese initialized wo
我们先调用父类的Person()方法,在调用子类的public Chinese(String str)。
假设我们修改Person类,
public class Person {
    public Person(String str){
        System.out.println("Person initialized"+str);
    }
}
那么编译器就好报chinese类的编译错误,也就是你必须调用的父类的构造方法,没有默认方法时必须通过super调用父类的构造函数。
Chinese类就得相应的修改为:
public class Chinese extends Person {

    public Chinese() {
        super(null);
        System.out.println("Chinese initalized ");
    }

    public Chinese(String str) {
        super(str);
        System.out.println("Chinese initialized " + str);
    }
}
结果:
Person initialized wo
Chinese initialized wo
假设我们修改Person类,
public class Person {
}
那么不对Chinese进行修改,也不会报错,这个时候没有显示的构造方法,就会启用默认的构造方法了。
另外,我觉得调用了父类的构造方法,但是并没有生成父类的对象,因为如果父类是抽象类的话,是不会支持实例化的。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:230次
    • 积分:40
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档