Notes for TIJ 简易电子版

来源:互联网 发布:js 隐藏class 编辑:程序博客网 时间:2024/04/29 07:13

TIJ是一本不错的JAVA基础书。不过感觉不太适合入门学,入门后再看这本会对JAVA语言和一些面向对象的概念有更深层次的理解,最大的好处在于写JAVA程序的时候如果碰到DEBUG上的疑难杂症,语言基础好的人往往能比较快地找出问题,解决问题。

这本书如果要吃透,需要花费不少的时间,我是个看到砖头书就晕的人,因此电子版的书是我的首选。以下就是我阅读TIJ电子简易版的笔记。

第一,二章:
1,  在传递对象的时候,除了那些基本的数据类型,通常是指传递一个到某个对象的引用。
2, return; 的作用就是退出该方法(不返回任何参数)。
3,  当前空闲内存和总内存: Runtime rt=Runtime.getRuntime(); long fm = rt.freeMemory(); long tm=rt.totalmemory():
4,  返回系统当前时间,以毫秒表示。long curTime = System.currentTimeMillis();
 
第三章:
1.随机数的使用:Random random=new Random, 只需调用不同的方法即可:nextInt()nextLong()nextFloat()或者nextDouble()。若随同随机数生成器的结果使用,模数运算符(%)可将结果限制到运算对象减1的上限。如要产生99以内的随机数则:int randomnum=random.nextInt()%100
 
2.关于比较 ==或者!=如果用在对象间比较的是对象的引用,因此两个对象即使内容相同,但引用不同,比较出来还是FALSE: Integer i1=new Integer(10); Integer i2=new Integer(10); System.out.println(i1==i2)。结果将是false.
至于,Object.equals()比较的也是默认的对象引用,但在JAVA库当中的多数类都改写了这个方法,如Integer.equals()已经被改写为比较对象的内容,即int值。要注意的是,如果自己定义了一个类,又没有改写equals的方法,那么如果新建这个类的两个对象进行比较,比较的还是对象的引用而不是具体哪个值。
 
3,关于短路(short circuit)如果是method1()&&method2()&&method3()true 或者false,如果method1()已经得出了false,那么接下来的方法将不被执行到,因为结果已经有了,这样叫做短路。
 
4. 按位运算符:用来操作一个整数数据类型中的单个’bit’,对于二进制数进行运算,常见的有AND运算符(&, OR运算符(|, XOR^,异或, 按位NOT~,也叫作运算符)。 XOR值的是两个值如果有一个是1,但又不全是1的时候结果是真。
对于操作boolean类型的变量,按位运算符的功能和逻辑运算符相同,但是没有按位NOT, 并且新增加了异或,这是在逻辑运算中所没有的。而且短路的现象不存在,比较的几方都必须过一过。
 
5.三元运算符:布尔表达式 ? 0:1
 
5,  转型:表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。若将一个float值与一个double值相乘,结果就是double;如将一个int和一个long值相加,则结果为long。什么时候进行转型:就是当把一个值负值给比它小的单位,或者把一个对象(object)恢复成它实际的对象(如Car)的时候转型。
 
6do
语句
while(布尔表达式)
whiledo-while唯一的区别就是do-while肯定会至少执行一次;也就是说,至少会将其中的语句过一遍”——即便表达式第一次便计算为false
 
6,  循环当中,break; continue;语句的差别,break;结束整个循环。Continue;结束当前这一次循环,程序回到循环语句开始下一轮循环;
8 Java当中不含goto语句,但goto语句作为保留字。 Java中还有标签,主要是在嵌套循环的时候配合break或者continue使用。
9分支语句,在对整数型数据或者字符型数据进行判别的时候使用,若判别其他类型的,如String 或者float,分支语句不可使用。
 
第四章:
1.关于构建器。如果一个类当中没有定义构建器,在new一个对象的时候,编译程序就会帮我们自动合成一个不带参数而且没有初始化任何东西的构建器,若没有它,任何方法都不能被调用。如果一个类当中自己声明了一个或多个构建器,编译程序就不会自动合成那个不带参数的构建器了,如类中有一个构建器public car(int i){..} ,在new一个对象时候,如果new Car();编译程序就会报没有car()这个构建器。
 
2.关于this, this关键字用在方法内部,指的是对于调用本方法的那个对象的引用,this.field常用来引用一个类的成员数据。如在一个方法的return语句中,return this; 指的就是返回这个方法调用对象的引用,接下来你可以用这个返回的this调用其他方法。如果在一个类中的方法调用同一个类当中的另外一个方法,不需要用到this,因为this会自动作用于那个方法。
 
3.关于static,表示静态。不能从一个静态方法中发出对非静态的方法或者关键字的访问,需要的时候要new一个对象,然后由对象发出对非静态方法的访问。反过来,对非静态的方法可以访问静态的方法或关键字。
 
3finalize() 方法,是Object的一个方法,用来被他的子类改写,来激活垃圾收集器或者释放系统资源。
 
4.关于try,catch,finally, try 必须跟catch 或者finally中间的一个匹配就可以了。
 
5null ,指一个空对象,对象引用实例变量的缺省指为null.。一般给对象赋值之前,常需要对给人赋值的对象进行是否null的判断,以免出现NullPointerException…to be continued.
 
6.关于TreeSet(面试中出现的)。它并不是线程安全的,只是Set的元素是排好序的。如果需要是的Collection, List, Map等配置线程安全,可以是用Collections类的一些工具方法,如:Collections.synchronizedCollection(Collection c); Collections.synchronizedList(List l); Collections.synchronizedMap(Map m);等。
 
7 Math.random()的作用,它返回一个double类型的数据,范围是0.0 1.0。同new Random.nextDouble一样。
 
8.关于四种作用范围: public:开放的,任何类都能访问。 private:私有的,只有本类当中可见,连有继承关系的子类都不可见。Protected:受保护的,跟private差不多,区别就是只有继承该类的子类可见protected的方法或变量。default:默认的方法,就是什么都不写,指的是package的作用范围,对于在同一个包里的其他类可见。
 
9.关于初始化的顺序:一个类初始化时,所有变量是最先初始化的,包括在方法中的变量,甚至在构建器之前就初始化了。
在这里有必要总结一下对象的创建过程。请考虑一个名为Dog的类:
(1) 类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2) 找到Dog.class后(它会创建一个Class对象,这将在后面学到),它的所有static初始化模块都会运行。因此,static初始化仅发生一次——Class对象首次载入的时候。
(3) 创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分配足够多的存储空间。
(4) 这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及booleanchar的等价设定)。
(5) 进行字段定义时发生的所有初始化都会执行。
(6) 执行构建器。这实际可能要求进行相当多的操作,特别是在涉及继承的时候。
 
10.关于static 变量初始化。可使用static构建从句
例:
class Cups {
static Cup c1;
static Cup c2;
 static {
c1=new Cup();
c2=new Cup();
}
这段代码仅执行一次——首次生成那个类的一个对象时,或者首次访问属于那个类的一个static成员时(即便从未生成过那个类的对象)。
 
非静态变量初始化:Java提供了一种类似的方式:
Mug c1;
 Mug c2;
 {
    c1 = new Mug(1);
    c2 = new Mug(2);
}   
主要用于匿名内部类初始化,待续。。。
还可以用于数组的初始化:
String[] a=new String()
{“abc”,”def”};
 
11.声明数组的方法: int[] a;或者 int a[](c或c++的方法,推荐使用前一个)。
 
 
第五章.
1Protected访问控制,用于继承关系之间,即使父类和子类不在一个包内,用protected定义的方法在子类仍然有访问权限。相比之下friendly的访问权限就不能在不同的包内访问。
 
第六章:
1.关于有继承关系的初始化问题。在子类进行初始化的时候,父类会先进行初始化,对于父类中的static的变量,即使子类不生成一个对象,父类也对其先进行初始化,然后是子类变量的初始化,这是由于有可能子类中变量的正确初始化要取决于父类。在创建子类的一个对象时,实际上也创建了父类的一个对象,在外部看来父类的对象已经封装在子类的对象中了,如果父类中含有带参数的构建器,子类生成对象时需要调用父类的构建器,因为编译程序不会再位父类自动生成一个不带参数的构建器来生成父类的一个变量。顺序问题可以具体看本章的最后一个例子。
2.关于什么时候用到继承。当我们需要对基础类进行衍生。由于衍生出来的类具有基础类的接口,因此衍生类可以upcasting(上溯造型)成基础类。可以实现JAVA的多形性。
 
第七章:多形性
1.为什么使用多形。它允许程序员将发生改变的东西同没有发生改变的东西区分开。将父类(Ball)作为参数或者自变量使用,而不是指定特定的子类(Basketball, Volleyball…),在进行某些动作的时候只要把子类当作参数传入(play(Ball ball),而不用估计到底有几种子类,只让代码卡于父类(基础类)打交道。这样工作量会大大减少。
2.为什么能实现多形。因为java对所以方法实行后期绑定,即运行期绑定,除非一个方法是final的。即在运行期才决定方法的主体是什么。Final能有效地关闭动态绑定(因为final方法是不可改写的,只能为一个类所用),从而提高运行效率。
3.抽象方法:只声明要有一个方法,没有方法体。abstract void mathod1(); 如果一个类包含了一个或多个抽象方法,类就要定义成抽象类(abstract class)。抽象类不可新建一个对象。
4.接口。接口是一个纯的抽象类,所以的方法都是抽象的。接口中只包含基本数据成员,都是定义成static final的,但不必写出来,因为默认的类型就是那样。它仅规定一个类的基本形式:方法名、自变量列表以及返回类型。:使用接口的最重要的原因是能上溯造型至多个基础类。具体见7.5.1
5.接口继承。通过继承,可以为一个接口添加新的方法(接口继承接口),也可以将几个接口合成为一个接口(接口继承多个接口)。
6. 补充:javax.sql.DataSource接口的作用。Java语言提供了这个接口来实现连接池。这个接口由数据源来实现,所有的数据源都必须实现这个接口。以获取连接池或者更加复杂的分布式数据的实现。
 
第八章:对象的容纳。
1.由基本数据类型构成的数组会自动初始化成零(针对数值类型)、null(字符类型)或者false(布尔类型)。(即在new了以后,如果没有,编译程序会禁止我们对数组成员的访问)。
2.由对象型构成的数组会自动初始化为null对象。因此可以判断成员是否为null.
3. Enumeration, 类似于Iterator它属于反复器一种简单的实现方式
 
第九章:违例差错控制。
1throws 语句,用来定义方法或者类需要抛出异常的一个类似模板的实现,目的在于库的提供者可能自定义了一种异常,或者使用java的非runtimeException的异常,强制要求客户程序员在new这个类,或者使用这个方法的时候需要做捕获异常的动作。throws定义的异常,只是表示可能抛出的异常类型,并没有实际的抛出异常,实际抛出异常由throw实现,一般是 throw new MyException(“”); 如果一个方法中对可能发生的异常无法处理或者不处理,可以继续throw 出去,即把异常向上抛,让它的上一级来处理,如果上一级还不能处理,就继续往上抛,直到顶部使用catch(MyException e)中来处理异常的情况。
2,违例匹配,如果一个方法可能抛出多个异常,或者说我们对异常的类型不太清楚,不知道该捕获哪种异常,可以catch可能出现异常的基础类,如ExceptionTry当中抛出一个违例的时候,违例控制系统会在几个catch类中就近找寻最匹配的异常,找到后就默认为异常得到控制,不继续往下找,因此catch异常时,应该把最有把握的异常放前面,依次下来,最后才放基础类(如Exception)。即使只放个基础类,违例控制系统也会按照违例匹配原则找到。
3RuntimeException运行期异常,对于运行期异常的子类。我们没有必要将其包含到我们的违例规范里,也不用在方法中使用try catch..指出一个方法可能会出一个RuntimeException,因为已经假定可能出现那种情况。我们应该在代码中用if语句判别这种情况,如object==null, 分母不为空啊等等。。
 
第十章.
 
第十一章:运行期间类型鉴定。
1. Class 对象,即“元类”对象。对于每一个类,他们都有对应的一个“元类”对象。也就是说写一个新类的时候,同时也就创建一个Class对象。在运行期间,如果要生成一个类的对象,系统先检查这个类的Class对象是否被载入,如有,就从这个类的Class对象创建一个对象(或者说所有的实例都由Class对象创建)。如无,JVM先查找同名的.class文件,并将其载入供以后产生这个类的实例时使用。因此java是不完全载入的。所有的实例对象都可以调用Object对象提供的一个.getClass()的方法,来获取运行期间的Class对象。
 
2Class类的一个静态方法:获得一个类的静态方法:Class.forName(String className)。这个方法是输入一个类名,返回一个Class的类。另外一种方法,特别是对于基本数据类型,也可以获得Class类的指针。如Class c=int.class。对于基本数据类型的封装类可用:Class c=Integer.class
原创粉丝点击