接口:
Java的接口就像是100%的纯抽象类
接口的方法都带有public和abstract意义,这两个修饰符是属于选择性的
完全不同的继承树的类可以实现相同的接口,使用接口就像是说“不管来自哪里,只要实现这个接口,别人就会知道你一定会履行这个合约”
当用接口来作为多态类型运用时,对象就可以来自任何地方了,唯一的条件就是该对象必须是来自有实现此接口的类。
允许不同继承树的类实现共同的接口对Java API是非常重要的
1 如果新的类无法对其他的类通过IS-A测试时,就设计不继承其他类的类
2 只有在需要某类的特殊化版本时,以覆盖或增加新的方法来继承现有的类
3 当你需要定义一群子类的模板,又不想让程序员初始化此模板时,设计出抽象的类给他们用
4 如果想要定义出类可以扮演的角色,使用接口
chap 9 构造器与垃圾收集器
Java中 堆heap --对象的生存空间,可垃圾回收。stack--方法调用及局部变量的生存空间
局部变量:局部变量和方法的参数都是被声明在方法中,它们是暂时的,且生命周期只限于方法被放在
栈上的这段期间,也就是方法调用至执行完毕这段时间为止。
实例变量:实例变量是被声明在类而不是方法里。它们代表每个独立对象的”字段“,实例变量存在于所属对象的堆空间25中
实例变量的默认值:primitive原始类型的默认值是0/0.0/false,引用的默认值是null。
java虚拟机启动时,它会从底层的操作系统取得一块内存,并以此区段来执行java程序。
当调用一个方法时,该方法会放在调用栈的栈顶。实际被堆上栈的是堆栈块,它带有
方法的状态,包括执行到哪一行程序以及所有的局部变量的值。所有局部变量都存在于栈上相对应的堆栈块中。
栈顶上的方法是目前正在执行的方法,方法会一直待在这里直到执行完毕
构造函数的一项关键特征就是它会在对象能够被赋值给引用之前就执行。
构造函数不会被继承
java可以有与类同名的方法而不会变成构造函数,其中的差别在于有没有返回类型
编译器只在完全没有设定构造函数时才会调用,如果已经写了一个有参数的构造函数,并且需要一个没有参数的构造函数,则必须自己手动写
在创建对象时,所有继承下来的构造函数都会执行,调用父类构造函数的唯一方法是调用super(),如果没有手动调用,编译器会自动加入。因此如果自己写的构造函数没有调用super,编译器会帮你对每个重载版本的构造函数加上super(),但编译器加的一定是没有参数的版本,假使父类有多个重载版本,也只有无参数的这个版本会被调用到。
对super的调用必须是构造函数的第一个语句
抽象类也有构造函数。抽象类的构造函数会在具体子类创建出实例时执行
从某个构造函数调用重载版的另一个构造函数:需要用this,this就是对对象本身的引用
this()只能用在构造函数中,且它必须是第一行语句,所以每个构造函数可以选择调用super()或this(),但不能同时调用