Head first java
1. 五:编写程序——超强力方法
1. 开发步骤:伪码——测试码——真实码
2. 极限编程XP:先写测试用代码(不是一定要执行的测试代码,只为清晰思路)
3. Integer.parseInt(string) //只对代表数字的string起作用
4. For(int cell :locationCells){} //locationCells为数组或其他集合
5. Cast运算符:(int)(某小数)即直接将小数后的数字去掉,即(int)0.1=0。Boolean不可被cast
6. Math.random()
7. Interface,implement与extend:
Interface用来规定几种事物的共同动作,是抽象的
Implement用来具体实现某个事物的interface规定的某个动作
Extend为继承一个父类
2. 六java的API
1. ArrayList
只能携带对象,但编译器可自动将primitive主数据类型包装为对象存在ArrayList中。
2. 布尔表达式:&&,||,!=,!,(长运算符:&|通常做位运算)
3. Java.lang包是默认导入的,其他的包要首先import该包。如果未在开始阶段导入包,之后使用的每次都要打出该包的全名。Import不会使程序变大。
3. 继承与多态
1. 次级类会继承上级类的方法,子类可以覆盖(重新定义)继承下来的方法,实例变量不可以背覆盖掉。Public classFamilyDoctor extends Doctor {}继承设计要遵循is-a思路。
2. 子类使用父类的方法可以直接通过.调用;父类不可使用子类的方法,因为只能单向继承。子类认同父类方法并要在该基础上延伸功能用super。
Public void roam(){
Super.Roam();
//ownstuff
}
3. 父类的存取权限:private、default、protected、public
4. 多态:声明的引用变量可指向该变量对应的对象或extends过该类的子类对应的对象。即父类引用变量可指向子类。不仅引用类型可以多态,参数与返回类型也可以。如函数的形参是一个类的父类的引用变量,则也可以引入子类的对象。
5. 看不到类的源代码并想改变其方法时,可以采用子类设计好的方法覆盖掉它原本的方法。
6. 类的权限:1)未标明public的类只能被同一包的类作出子类;2)final修饰符表示该类为继承树末端,不能再被继承;3)HC33让类只有private构造过程(chapter5讲)??
7. 覆盖(override)与重载(overload)
覆盖要求:参数一致,返回类型兼容,不可降低方法存储权限;
重载要求:不可只改变返回类型(会造成两个返回类型矛盾),可改变参数类型,返回类型,存储权限。即为一个同名称的方法定义更多的可能性。
4. 接口与多态
1. 抽象类:不可被初始化为实例即不可被new,但可以做引用类型。abstract class …。抽象类代表此类一定被extends过。
2. 具体类:可被实例化,也可做引用类型
3. 抽象方法:public abstract void eat(){}(更像一组共同的协议)
抽象方法无实体。必须在抽象类中。即具体类中不可能有抽象方法。抽象方法一定被覆盖过。多态好处在于所有子型都会有那些抽象的方法。
抽象方法无内容。只为标记出多态而存在。它的声明以分号结束。
4. Java中所有类都是从Object类中继承出来的。Object类为终极对象,其内有一些希望各类都有的行为。它不属于抽象类,因为他有具体的实现代码的方式,没有一定要被覆盖的方法。HC33该类创建对象可用在线程的同步化上,
5. 编译器根据引用类型判断有哪些method可以用,而不是根据引用变量指向的对象。因此体现多态的父类引用变量也只可调用父类里面定义的方法。为了实现更广阔的多态性,可以在父类里定义统一的方法之后再覆盖掉。
有一种方法可以对对象调用其特有方法,即重新定义一个该对象类型对应的引用变量并使用强制转化的方式赋值给该变量,就可以全部使用该类的方法了。
Eg:继承关系为:Animal->Dog
Animal o = new Dog();
if (o instanceof Dog){
Dog d =(Dog)o;
}
d.特定方法
6. 解决多重继承:interface
Java中的接口就像100%纯抽象类一样。其内所有方法都需要子类自己来实现,这样就不会出现致命方块问题。所有的方法都是public与abstract的。
定义与实现代码:public interface ***{}
Public class Dog extends Animalimplements ***,**,*{} //可实现多个接口
5. 构造器与垃圾收集器
1. 两种内存空间:栈(stack)与堆(heap)
对象及对象的实例变量在heap上,方法与局部变量在stack上。
2. 构造函数(相当于初始化)
Duck myDuck = new Duck(); // new Duck是构造函数
与类同名,无返回类型,不会被继承,当需要创建对象时初始化一些参数时使用。可以重载。自己没有写构造函数时,编译器会自动生成一个无参数的构造函数。如果自己写了构造函数,无论数有参数还是无参数,编译器就不会参与构造函数的任何生成工作。构造函数可以有多个,即重载。可为公有私有或不指定。
public class Duck{
int size;
//构造函数
public Duck (int ducksize){
system.out.println(“quack”);
size = ducksize;
}}
Duck d = new Duck (42);
/******************************************************************/
子类与父类构造函数关系
Eg:继承关系为:Animal->Dog
Dog d = new Dog();时构造函数执行为:
Dog()->Animal()->Object()->Animal()->Dog()
public Duck (int ducksize){
super(); //调用父类的构造函数,自己不写编译器会自动加,但若自己写一定要写到开始处
system.out.println(“quack”);
size = ducksize;
}
3. 默认值
实例变量:0/0.0、FALSE
引用:null
4. This 的用法HC33
指做当前对象this.name = name(同名称情况java默认保留作用范围小的参数)
调用同一类中其他的构造函数,必须在第一行,不可以super同时出现(因为super也要在第一行)
5. 对象生命周期
Life:生存时间
Scope:作用范围(只在其自己方法内可以作用,如果方法内调用了其他方法导致该方法不在栈顶则不是他的作用范围,但仍在life内)