Head first Java要点总结
Java的程序结构:源文件——类——方法——语句。
源文件(source file):是个文件,扩展名为.java,带有类的定义。
类(class file):类带有关键字class,类中有一个或者多个方法。
方法(method):方法必须在类的内部声明,方法里面有语句。可以认为方法是一个函数或者过程。
类和对象的区别在于类是对象的蓝图,对象是类的实例。
类会告诉虚拟机如何创建某种类型的对象,类上的方法就是程序员对对象会做的事情。
对象就好比通讯录上的一笔数据,通讯录上每张卡片都有空白字段(实例变量),填入新的联络人就好比创建新的实例(对象),填入的数据就是对象的状态。
对象有状态和行为,也就是实例变量和方法。对象的状态会影响行为、行为会影响状态。
子类继承父类意味着子类继承了父类的实例变量和方法,但是子类可以添加新的实例变量和方法,也可以重写父类的方法覆盖掉原有的父类方法。
对于抽象类(带有abstract标识符),不应该将他们初始化。抽象类应该用于继承和产生多态,而不是用于实例化。
一个Wolf类,我们可以创建出具体的对象,也可以定义出对象的具体属性和方法,比如有几条腿、是否群居等等。
但是对于Animal类,就无法创建出具体的对象,没有办法创建出具体的方法,或者创建出的方法比较复杂。
生物学上有界门纲目科属种,比如说狼,属于动物界 脊索动物门 脊椎动物亚门 哺乳纲 真兽亚纲 食肉目 犬科 犬属 狼,那么只有狼才是真正可以创建实例的类,前面的都可以认为是抽象类。
Java中所有的类都是从Object中继承而来,所以每个对象都是Object的实例,也都可以当成是Object来处理。
使用一个ArrayList存储不同类型的对象,再次将对象取出来的时候,编译器会将所有原来不同类型的对象全部认为是Object类型。把所有对象都以多态当成是Object类型会让对象失去其特性,当然可以通过语句将Object类型再转换成具体的类。
编译器根据引用类型来决定有哪些方法可以调用,而不是根据实际类型,所以使用Object类型的多态引用无法通过编译。
为了让一个由继承得来的类实现另一个类的方法,使用接口是一个较好的选择。
举个例子,一个Dog类继承自Object、继承自Animal,如果想给他加上Pet类中的Play方法,最简单的做法是直接在类里面写Play方法。如果还想让Cat类也实现Play呢?
如果在Cat类和Dog类中都添加Play方法,这显然不够简洁。
如果选择在Animal类中加Play方法,那么其他Animal也会获得Play方法,很明显其他Animal不需要这个方法,而且不同动物的Play方法不一样。
如果继续使用上面的方法,但是在Animal中写的是抽象类,那么每一个继承自Animal的对象都要实现这样的方法,很明显这很复杂,而且会让Animal类较局限。
所以可能的方法是让一个类拥有多个父类,也就是多重继承,但是Java不支持这种方法。
最好的方法是通过接口来解决多重继承的问题。
Java的接口好比100%的抽象类,他会把全部的方法变成抽象的,所以子类要实现此方法,那么Java虚拟机就能弄明白要实现哪个继承。
接口的定义用interface,接口的实现用inplements。
Super关键字用于在子类调用被覆盖过的父类方法。
内存中有两个区域:对象的生存空间堆和方法调用和变量的生存空间栈。
局部变量在方法所在的栈上,实例变量在对象所属的堆上。
构造函数可以在对象被使用之前就执行,不会被继承。
211