第七章、复用类

1.当创建一个导出类的对象时候,该对象包含了一个基类的子对象,用super表示其引用。

2.类构造之前先构造父类。

3.如果父类构造器中带有参数,那么必须在子类构构造器中第一件事就是调用super……

4.

重载:根据同方法名,不同参数列表形式。

重写:同方法名,同参数列表,加了override为重写。

5

. 组合:has-a,直接用其方法实现功能。

继承:is-a,通过这个通用类可以创建新版本的类。

6.向上转型:新类是现有类的一种类型,即子类也是一种类型的父类。因为向基类发送的所有信息同样可以向导出类发送,正如以前提到的那样,方法定义参数用父类,实际传入为子类型。

7.子类可能比基类含有更多的方法,但是它必须至少具备基类中所包含的方法。在向上转型过程中,类接口中唯一可能发生的事情是缺方法,而不是获取方法,所以用子类传入父类要求的类型,仍可以发送消息。这就是编译器允许向上转型的原因。

8.继承使用之前可以自问“我真的需要向上转型吗?”,否则可以用组合代替。

9.final数据:

a.使用场景:

1)一个永不改变的编译时常量。

2)一个在运行时被初始化的值,而你不希望他被改变。

b.对于1)中的编译时常量,必须是一个基本类型数据,并以final表示,定义时必定赋值(ps:因为存在空的final,这里是否可以理解为使用前必须赋值)

c.一个即是static又是final的域,只占一段不能改变的存储空间。

d.当对象引用而不是基本数据类型运用final时,令人迷惑,final使得引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它指向另一个对象,但是对象本身可以被修改。ps:数组也是对象。

e.public static final int VALUE_THREE = 39;(典型常量定义方式)

public:可以被用于包外;

static:强调只有一份。(其实static是不管你new了多少个对象,都是同一个值,而没有static,即使使用了final,不同对象还是不同的;static在转载是初始化,而不是每次创建新对象时都初始化)

final:说明是一个常量。

f.空白final:定义时不赋值而是在构造器中完成赋值,以做到根据不同对象而又不同值,但final域必须在使用前总是被初始化的。

g.final参数:无法再方法中更改参数引用所指向的对象,主要用于向匿名内部类传数据。

10.final方法使用场景:

a.吧方法锁定,以防任何继承类修改它的定义,以确保在继承中使方法行为保持不变并不会被覆盖。

b.效率,但劝阻不适用,让编译器、jvm自己处理。

11.final类:表明你不打算继承该类,而且也不允许别人这样做。因此,final类中所有的方法都隐式的制定为final。

12.初始化和类加载:

每个类的编译都存在于它自己独立的文件中,该文件只在需要使用程序代码时才会被加载。也就是说,类的代码都在第一次使用时候才加载。通常指加载发生于创建类的是一个对象时,但当访问static域或方法时候也会加载,构造器本来也是static方法,尽管static没有显式写出来。

类加载过程

a-试图访问子类的main方法,加载器开始启动并找到class文件。

b-加载器发现有基类,加载基类,以此类推。

c-基类中static初始化,先初始化再调用构造器;以此类推。

d-所有类加载完毕,子类里的基本类型设置为默认值,对象设为null。

e-子类构造器被调用,第一行显示/隐式也会先调用父类构造器,所以也可理解为先调用父类构造器再调用子类构造器。

 

第六章、访问权限控制

1.每个编译单元,即每个.java文件,只能有一个public类,内部类除外。

2.protected也提供包访问权限。所有由大到小为:public protected 缺省 private

3.对于类的访问权限只能是包或者public。

4.构造函数为private的类不可以直接new。

5.给出个单例模式的示例:

public class SingleDemo{

private SingleDemo(){}

private static SingleDemo sd = new SingleDemo();

public static instance(){

return sd;

}

}

更多关于类的权限以及内部类的可以参考http://blog.tomner.com/?p=681

好了都凌晨1点半了快,困死抓紧睡觉去。今天就不看书了~明天吧第七章的补上~困觉去也!!

第五章、初始化和清理

1.构造器木有返回值,这个和返回void有明显的区别的哦。

2.涉及到基本类型的重载(注意重载和重写的区别):

当传入的数据类型小于方法中申明形式的参数类型时候,实际的数据会被提升。ps:char有所不同,如无法找到合适的类型对应char,直接提升到了int略过了byte。

如果传入实际参数大于方法中申明形式的参数类型时候,必须通过类型转换,此时数据会被截断。否则是会报错的。

3.编译器暗自把“所操作对象的引用”作为第一个参数传入给方法中。例如peel(1),实际是peel(a,1),a表示peel所在类的一个对象引用。

4.this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用

5.同一个类中,一个构造器调用另一个构造器可以使用this关键字,此时this代替构造函数,例如:this(1,2)。但是要注意:

a.只能再构造器中这样使用,不能在其它任何方法内使用;

b.必须在最开始处使用;

c.只能调用一次。

6.static补充:

a.static方法就是没有this关键字的方法。

b.在static方法内部不可调用非静态方法,但是返过来可以。

c.static关键字不能应用于局部变量

d.static静态初始化只有在必要的时刻才会进行,即第一次创建/访问静态数据时候。

另可参考http://blog.tomner.com/?p=695最后一条关于static。

7.垃圾回收器只会释放那些由new分配的内存

8.finalize一般用在本地方法调用c/c++的free来释放内存。

9.System.gc();可以强制垃圾回收。

10.垃圾回收机制简单说明

a.停止-复制模式:

暂停程序运行–遍历堆栈和静态存储去所有引用并找出栈中所有存活对象–复制到新的堆中–引用修正

缺点:需要比实际多一倍的存储空间,有些无垃圾产生的也复制。

b.标记–清扫

暂停程序运行–遍历堆栈和静态存储去所有引用并找出栈中所有存活对象–标记–清空所有无标记对象–重新整理剩下对象到连续空间

java实际上是a b两种机制自适应进行。

11.JIT:需要装载类(new)时候,编译器先找到.class文件,将该类字节码装入内存。

12.我们无法阻止自动初始化的进行,它将在构造器被调用之前发生,即使被分散在类的各处

13.对象创建过程,以Dog类为例:

a.即使没有显示static关键字,构造器实际上也是静态方法,因此,首次创建类型为Dog的对象,或说Dog静态方法首次被访问时,java解释器必须找到类路径,以定位class文件。

b.然后载入Dog.class,有关静态初始化的所有动作都会执行。

c.当用new Dog()创建时,首先将在堆上为Dog对象分配足够的内存空间。

d.此空间被清零,设为默认值。

e.执行所有出现字段定义出的初始化动作。

f.执行构造器。

14.非静态子句,可以保证无论调用哪一个显示构造器,某些操作都会发生。

15.数组初始化:int[] a;/int a[];推荐使用第一种,表示int类型数组。

此时不允许指定数组的大小,即长度。因为定义的只是一个数组的引用,没有给对象分配内存,必须初始化

16.随机数:

a.

Random rand=new Random(47);

rand.nextInt(100);//0-100的整数,不包括100

b.

Math.random();产生0-1之间的数,不包括1

17.int[] a = new int[rank.nextInt(20)];这样可以创建长度为0-20之间任意长度的数组。对象可以指定长度,引用不可以

ps:基本类型在方法内定义不能自己初始化,必须给定值,而定义数组时候跟类成员一样可以初始化为默认值

18.创建非基本类型的数组:

Integer[] a = new Integer[rank.nextInt(20)];

这里只是创建了引用数组,必须在后面给每个int[i]赋值,否则对象为null;

这里以及17中的new可以理解为new一个数组,而不是int/Integer对象。(当然int不能new)

19.Object很有用,因为所有类都直接或间接继承与Object。

20.f(类型…,arg1)…表示可变参数,>=0个,f(arg1)同样可以调用。

第四章、控制执行流程

1.逗号操作符在控制流程中唯一用到的是在for循环中,只有for可以定义多个变量。逗号用来分隔语句独立执行。例如:

for(int i=0,j=0;i++,j<=10){}

2.标签(类似C/C++中的goto)可以在内部循环中直接跳到外部循环。标签一般不会去使用。

3.switch的“参数”必须为int或cahr

4.为了吧int c = c;当成字符打印,必须将其转型为char否则直接产生整形输出。

5.单引号”用于char,可转型为int。

第三章、操作符

1.两个对象引用的赋值,如s1=s2;,实际是赋引用的值,对s1操作,s2指向的对象也会同样改变。

2.==和equals区别

==、!=比较的是对象的引用,即引用所在的地址上的值,而非对象的内容。

equals比较对象的内容,但是自定义的类需要覆盖重写equals方法,默认为比较引用也就是==。不过大多数的java类库都已实现了equals方法来比较对象的内容。

3.移位操作只针对int(这点有待确认)或则说移位前会吧char、short等转成int。

 

第二章、一切都是对象

1.定义String s=”abc”;

s:引用(遥控器)

“abc”:对象(电视机)

s可以到处走,但是仍然可以操作对象;

s可以单独存在,例如:String s;这样就不能向s发送消息,否则会包运行时错误,因为s引用没有对象,即没有电视只有遥控显然是不可行的。

2.数据存储在何处?

寄存器(处理器中)

堆栈(RAM中)——>基本数据类型

堆(RAM)———–>new出来的对象

常量存储(代码内部)

非RAM存储(流对象、持久对象等在数据库或则文件中)

3.作用域

在作用域内,引用有效;作用域外,引用超出作用域范围失效,但对象仍然存在于内存中,由垃圾回收机制自行处理。

4.数据初始化

基本类型作为类的对象时候,编译器会自动初始化值,char为”;int为0;boolean为false

但是如果在方法内,则可能任意值所以会报错,不可取。

5.方法名和方法参数列表唯一的标识出某个方法。(包括参数顺序),这里要注意,返回值不能作为区分的依据,因为有时候我们根本不去关心返回内容。

6.方法只能作为类的一部分来创建,且只能被有权限的对象所调用;方法在类内部直接调用,这时候其实只是缺省了this关键字。ps:可以使用语句块。

7.如果方法返回void,而在方法内return;,表示退出方法,类似break。

8.static定义的方法不和包含它的类的任何对象关联在一起。如new两个该类的对象,取static方法或字段返回都是相同,因为他们指向同一个存储空间。

关于内部静态类参考http://blog.tomner.com/?p=681

第一章、对象导论

1.java虚拟机实现“后期绑定”:

即用到时候才找到正在需要的对象

所以父类<–子类,可以“向上转型”

即方法中可以用父类作为参数,而实际使用中传入子类的对象,执行是会根据实际情况调用子类的方法。

《编程思想》个人导论

很简单~坚持基本每天看10~20页,特殊日子有活动除外。

记录相对自己来说的重点~

then~这里记录下~以后有时间还好拿来看看~

预期2-3个月时间吧打大概的梳理一遍~在花个个把星期重温下~

over~