head first java 笔记 chapter 8~10

来源:互联网 发布:r混合编程 epub 编辑:程序博客网 时间:2024/06/10 19:14
Chapter 8 接口与抽象类

抽象类:可以让这个类不被初始化(不能被new)abstract 使用抽象类声明为引用类型给多态使用;抽象类除了被继承之外没有其他用处。(抽象的类可以带有抽象和非抽象的方法)
 
抽象方法:没有实体;没有方法体,直接以分号结束。
 

不能再非抽象的类中有抽象方法。如果声明了一个抽象方法,那,整个类也必须被标记为抽象。

在继承树下的第一个具体类必须实现所有的抽象方法


Object类是所有类的源头,是所有类的父类。Extends object{}可以省略;
没有直接继承过其他类的类是隐含的继承object对象
http://lavasoft.blog.51cto.com/62575/15456
 
然而对某个对象使用object引用时,java会把它当做object类型的实例,也就是说只能调用object类型中声明的方法。(可以强制转换为原来的类型)
=>编译器根据引用类型来判断有哪些method可以调用而不是根据对象确实的类型。
运算符instanceof检查引用类型是不是该类型:o instanceof Dog 返回boolean值

接口interface:将接口中的方法全部设为抽象的。(接口方法默认为public abstract)
Java不支持多重继承,但是支持继承父类同时使用接口(可以是多个接口)也就是说extends只有一个,implements可以由好多个(逗号分开)

 


Chapter 9 构造器与垃圾收集器(GC)

堆(heap):对象的生存空间
栈(stack):方法调用及变量的生存空间


实例变量在类中声明,保存在所属的对象中(堆上);
局部变量(栈变量)在方法中声明,声明周期只限于方法被放在栈上的这段时间(栈上);如果局部变量是一个引用变量,引用的对象是保存在堆上的。
也就是说,对象引用变量和primitive主数据类型都是放在栈上的;不管是实例变量还是局部变量,只要是对象就会存放到堆上。


调用一个方法时,会将这个方法入栈(放在调用栈的栈顶)。


局部变量只存活在声明该变量的方法中;实例变量的寿命和对象相同。
只要局部变量的堆栈还在栈上,局部变量还活着,会活到方法出栈执行完毕为止;局部变量范围只在声明他的方法内。


构造函数(不是方法!)是带有在初始化对象时会执行的程序代码。
唯一能调用构造函数的办法就是新建一个对象 ;new后面加上类名()
构造函数名称必须和类的名称相同,且构造函数没有返回类型。
构造函数不能被继承。


构造函数可以在对象能被赋值给引用前就执行。可以用来初始化对象的状态(例如当需要用户的输入来完成对象的创建)
可以把初始化的程序放到构造函数中,把构造函数设定成需要参数的。这样就能直接生成需要的对象,不用再赋值。


注:如果已经写了有参数的构造函数,就需要手写没有参数的构造函数。编译器只会在没有设定构造函数时自动生成没有参数的构造函数。
(如果有一个以上的构造函数重载,参数必须不同。)


注:原始默认值0/0.0/false/null


每个父类都有构造函数(super()),在创建新对象时,该类所有继承下来 的构造函数都会执行。(这是因为子类可能会用到父类的实例变量来继承方法)也就是说 new会启动构造函数的连锁反应,就算是抽象的父类也有构造函数。
执行时首先执行父类的构造函数,会一直向上连锁反应直到Object类(constructor chaining)。如果自己没有调用super(),编译器会帮忙加上无参数版本。


如果要在某个构造函数调用重载的另一个构造函数,用this(),根据输入什么参数判断是调用哪个构造函数。This()只能用在构造函数中,且只能是第一行语句,(this()和super()不能同时调用)this是对对象本身的引用。

垃圾收集器
对于一个对象,只要有引用就还算存在。当最后一个引用消失,对象会变成可回收的。


Chapter 10 数字与静态


Static关键词标记出不需要实例的方法。(不依靠实例变量也不需要对象的行为)
例如Math类中的所有方法,都是静态的。调用静态方法可以直接用类的名字
Math.min(42,32);
如果将构造函数设为private可以防止类被初始化,用这种方法math无法创建实例。(类只有静态方法时可以private构造函数)


静态方法不能调用非静态的变量,不能调用非静态方法,因为不知道是哪个对象的变量和方法


用类的名称调用静态方法;用引用变量的名称调用非静态方法。


静态变量的值对所有的实例来说都相同,可以被同类的所有实例共享。
实例变量,每个实例一个;静态变量每个类一个。
静态变量是在该类双肩任何对象前就完成初始化的,在任何该类的静态方法执行前就初始化。是在类被加载时初始化的。

静态final变量表示常数。例如 public static final double PI = 3.141592653589793

Final变量表示不能改变它的值;
Final方法表示不能覆盖该方法;
Final类表示不能继承该类。

Primitive主数据类型的包装 
Java5.0及以后版本可以直接把primitive主数据类型放入arraylist或hashmap中,(用对象方式处理primitive主数据类型时需要将他包装起来)autoboxing可以自动将primitive主数据理性转换成包装过的对象。自动包装和解开包装

Int-Integer; char – Character; byte- Byte; short – Short; long = Long ; float –Float ;double – Double.


注意:包装器作为对象默认值是null

数字格式化:String.format()
Date类型,calendar类型

Import静态的类、变量、enum可以在写代码时不写静态方法类名。