《Head First Java》20200928读书笔记

P249-P253

《Head First Java》20200928读书笔记

构造函数小回顾

  • 构造函数是在新建类时会执行的程序。
Duck d = new Duck();
  • 构造函数必须与类的名字一样,且没有返回类型。
public Duck(int size){   }
  • 如果你没有写构造函数,则编译器会帮你写一个没有参数。
public Duck(){   }
  • 一个类可以有很多个构造函数,但不能有相同的参数类型和顺序,这叫作重载过的构造函数。
public Duck(){   }
public Duck(int size){   }
public Duck(String name){   }
public Duck(String name,int size){   }

问:构造函数应该是公有的吗?
答:不。构造函数可以是公有,私有或不指定的。

问:一个私有的构造函数有什么作用?没有人能够调用它,所以也就没有能够创建该对象?
答:不是这么说的。私有不是完全不能存取,它代表该类以外不能存取。

父类、继承与构造函数之间的关系

在创建某个对象时(完全没有其他方法能够创建对象,只能通过new来产生新对象),对象会取得所有实例变量所需的空间,这当然也包括继承下来的东西。
在这里插入图片描述
在这里插入图片描述
此图所示只有一个对象。但因为它带有Snowboard与Object的内容,所以这两个类的所有实例变量也会在这里。

父类的构造函数在对象的生命中所扮演的角色

在创建新对象时,所有继承下来的构造函数都会执行。
这代表每个父类都有一个构造函数(因为每个类至少都会有一个构造函数),且每个构造函数都会在子类对象创建时期执行。
执行new的指令是个重大事件,它会启动构造函数连锁反应。
还有,就算是抽象的类也有构造函数。
虽然你不能对抽象的类执行new操作,但抽象的类还是父类,因此它的构造函数会在具体的子类创建出实例时执行。
在构造函数中用super调用父类的构造函数的部分。
要记得子类可能会根据父类的状态来继承方法(也就是父类的实例变量)。
完整的对象需要也是完整的父类核心,所以这就是为什么父类构造函数必须执行的原因。
就算Animal上有些变量是Hippo不会用到的,但Hippo可能会用到某些继承下来的方法必须读取Animal的实例变量。
构造函数在执行的时候,第一件事是去执行它的父类的构造函数,这会连锁反应到Object这个类为止。
在这里插入图片描述
Hippo对象IS-A Animal同时也IS-A Object。如果你要创建出Hippo,也得创建出Animal与Object的部分。
这样的过程被称为“构造函数链(Constructor Chaining)”

创建Hippo也代表创建Animal与Object

public class Animal{
	public Animal(){
		System.out.println("Making an Animal");
	}
}

public class Hippo extends Animal{
	public Hippo(){
		System.out.println("Making a Hippo");
	}
}

public class TestHippo{
	public static void main(String[] args){
		System.out.println("Starting...");
		Hippo h = new Hippo();
	}
}

在这里插入图片描述

如何调用父类的构造函数?

调用父类构造的唯一方法是调用super()。

public class Duck extends Animal{
	int size;

	public Duck(int newSize){
		super();//要这么调用
		size = newwSize;
	}
}

在你的构造函数中super()会把父类的构造函数放在堆栈的最上方。
父类的构造函数会调用它的父类构造函数。
这会一路上去直到Object的构造函数为止。
然后再一路执行,弹出回到原来的构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值