一、构造器的定义与作用
1.构造器的特征:
具有和类相同的名称;不含返回值 ;如果没有构造器,系统默认提供。
2.作用:
为创建的对象执行初始化
3.语法格式:
<修饰符><类名>([<参数列表>]){
[<语句>]
}
public student(){ } //无参构造方法
public student(String name,int age){
this name = name;
this age = age;
} //有参构造方法
4.构造器中的this和super
this:哪个对象调用构造器就指向哪个对象!
super:调用父类的构造器;
5.构造器中的继承及调用
执行子类构造器时一定会调用父类构造器。如果要调用有参的父类构造器,就必须在子类构造器的第一行写上super()
具体例子如下!!!
类型一:子类父类都包含有参构造器和无参构造器,创建一个无参构造器的对象
public class Demo03Zi extends Demo03Fu {
public Demo03Zi(){
//这里缺省调用了一个super();
System.out.println("子类无参构造器");
}
public Demo03Zi(int num){
System.out.println("子类有参构造器");
}
public static void main(String[] args) {
// Demo03Zi zi = new Demo03Zi();
Demo03Zi z = new Demo03Zi();
}
}
public class Demo03Fu {
public Demo03Fu(){
System.out.println("父类无参构造器");
}
public Demo03Fu(int num){
System.out.println("父类带参构造器");
}
}
输出:
父类无参构造器
子类无参构造器
类型二:子类父类都包含有参构造器和无参构造器,创建一个有参构造器的对象
public class Demo03Zi extends Demo03Fu {
public Demo03Zi(){
System.out.println("子类无参构造器");
}
public Demo03Zi(int num){
//这里也隐式调用了一个super(); 如果要调用父类有参构造方法,那就要显示调用了super(3);
//具体如下个例子
System.out.println("子类有参构造器");
}
public static void main(String[] args) {
Demo03Zi zi = new Demo03Zi(44);
// Demo03Zi z = new Demo03Zi();
}
}
public class Demo03Fu {
public Demo03Fu(){
System.out.println("父类无参构造器");
}
public Demo03Fu(int num){
System.out.println("父类带参构造器");
}
}
输出:
父类无参构造器
子类有参构造器
类型三:子类父类都包含有参构造器和无参构造器,创建一个有参构造器的对象。在有参构造函数下使用带参super;
public class Demo03Zi extends Demo03Fu {
public Demo03Zi(){
System.out.println("子类无参构造器");
}
public Demo03Zi(int num){
super(45);
System.out.println("子类有参构造器");
}
public static void main(String[] args) {
Demo03Zi zi = new Demo03Zi(44);
// Demo03Zi z = new Demo03Zi();
}
}
public class Demo03Fu {
public Demo03Fu(){
System.out.println("父类无参构造器");
}
public Demo03Fu(int num){
System.out.println("父类带参构造器");
}
}
输出:
父类带参构造器
子类有参构造器
类型四:子类包含有参构造器和无参构造器,父类仅有一个有参构造方法,创建一个无参构造器的对象。
public class Demo03Zi extends Demo03Fu {
public Demo03Zi(){
System.out.println("子类无参构造器");
}
public Demo03Zi(int num){
System.out.println("子类有参构造器");
}
public static void main(String[] args) {
// Demo03Zi zi = new Demo03Zi(44);
Demo03Zi z = new Demo03Zi();
}
}
public class Demo03Fu {
/* public Demo03Fu(){
System.out.println("父类无参构造器");
}*/
public Demo03Fu(int num){
System.out.println("父类带参构造器");
}
}
输出:
报错!!
原因:因为创造对象的构造器是无参的,但是在父类构造器中又找不到无参构造器。
其余的差不多啦,掌握继承中构造器的执行顺序。及this和super的用法就好了;再看个其他的
//条件是子类有参无参构造器都有,父类仅有有参。创建带参的对象
public class Demo03Zi extends Demo03Fu {
public Demo03Zi(){
//this(); //这里如果使用this,这里的this表示调用该构造器外的其他构造器-->public
//Demo03Zi(int num)这个有参构造器,但是呢你没带参数,所以报错
// //这里你什么都不写,默认带一个super,但是向上找呢,没有父类无参构造器,所
//以报错
this(33); //这个才符合。
System.out.println("子类无参构造器");
}
public Demo03Zi(int num){
// this();
super(34);
System.out.println("子类有参构造器");
}
public static void main(String[] args) {
// Demo03Zi zi = new Demo03Zi(44);
Demo03Zi z = new Demo03Zi(43);
}
}
public class Demo03Fu {
/* public Demo03Fu(){
System.out.println("父类无参构造器");
}*/
public Demo03Fu(int num){
System.out.println("父类带参构造器");
}
}
输出:
父类带参构造器
子类有参构造器