您的位置:首页 > 编程语言 > Java开发

HeadFirst_Java读书笔记

2015-11-29 10:32 417 查看
1、Java中八种主数据类型赋值规则

2、对象仅存在于可垃圾回收的堆上,程序中使用的是引用变量

3、对于任意一个Java虚拟机来讲,引用变量的大小都是一样的。

4、Java中数组一定是对象,那么数组对象是什么类型呢?

5、实例变量(类的成员变量)永远都有默认值,局部变量却没有默认值,使用前必须赋初值

6、==只是用来对比两个变量的字节组合,可以判断内置主数据类型是否相等,两个引用是否指向同一个对象,对象是否相等要通过equals()来判断

7、虽然ArrayList只能存放对象而不是primitive主数据类型,但是Java编译器能够自动将primitive主数据类型包装成Object以存放在ArrayList中。

8、import与c中的include并不相同,使用import只是帮助省略每个类前面的包名而已,程序不会因为使用import而变大或变慢。

9、Java.lang包是基础包,其中的类不需要指定完整类名,其他包使用时都要指定完整类名。

10、Java中的所有类型都是从object类继承出来的。

11、用abstract修饰的类是抽象类,用abstract修饰的方法是抽象方法,含有抽象方法的类一定是抽象类。

12、object类不是抽象的,因为所有被其他类继承的方法都是有实现代码的。允许实例化

13、部分object方法可以被子类实现,建议实现自定义的hashCode、equals、toString。

14、Java是类型检查很强的语言,如果所有对象参数都是object类型,当下行转换时会无法通过编译。因为编译器无法将此对象识别为object以外的事物。强制类型转换可以解决下行转换但是要先使用instanceof运算符来检查。

15、Java不允许多重继承,因为多重继承存在“菱形问题”,提高复杂性,破坏Java简单的设计初衷。

16、所有接口的方法都是抽象的,任何实现该接口的类都必须实现这些方法。

17、super关键字用来引用父类对象。

18、实现接口时要使用implements这个关键字。

19、不管对象在哪里声明,它总是运行在堆上。

20、与c++一样如,如果类没有构造函数,编译器会加上默认构造器函数。注意,编译器只会在类中完全没有构造函数时才会这么做。

21、Java中可以有与类名同名的方法而不会变成构造函数,构造函数与类同名方法的区别是在于是否有返回类型。构造函数不会有返回类型。

22、调用父类构造函数的唯一方法是调用super(),如果你在子类的构造函数中没有调用super(),编译器会自动加上一个没有参数的父类构造调用:super(),每个子类构造函数都会先立即执行父类构造然后才执行自身代码。所以super()的调用必须是构造函数的第一个语句。

23、this是一个对象本身的引用,构造函数中可以通过this调用同一个类的另一个构造函数,每个构造函数可以选择调用super()或this(),但是不能同时调用。

24、this只能用在构造函数中,且它必须是第一行语句。

25、当最后一个引用消失时,对象就会变成可回收的。

26、类的静态变量会在该类的任何静态方法执行之前被初始化。

27、标记为final的变量代表它一旦被初始化之后就不会改动。

28、静态代码块:在类中可以将某一块代码声明为静态的,这样的程序块叫做静态初始化段,

static{

语句序列

}

静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面,静态代码块里面的变量都是局部变量,只在本块内有效,静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类,一个类中允许定义多个的静态代码块,执行的顺序根据定义的的顺序进行,静态代码块只能访问类的静态成员,而不允许访问实例成员。

Java编译器会收集所有的类变量初始化语句和类型的静态初始化器,将这些放在一个特殊的方法中:clinit,实际上,static块的执行发生在“初始化”阶段。初始化阶段JVM主要完成对静态变量的初始化,静态块执行等操作。

29、当一个类被主动使用时,Java虚拟机就会对其初始化,如下六种情况为主动使用:

当创建某个类的新实例时(new,反射,克隆,反序列化等),当调用某个类的静态方法时,当使用某个类或接口的静态字段时,当调用Java API的某些反射方法时,如类class中的方法,或者Java.lang.reflect中的类方法时,当初始化某个子类时,当虚拟机启动某个被标明为启动类的类(main)。

30、final修饰的变量代表你不能改变它的值,final修饰的方法代表你不能覆盖掉该方法,final修饰的类代表你不能继承该类。

31、+号是Java中唯一重载过的运算符。

32、有风险的方法必须在声明时声明抛出的异常。

33、方法可以抓住其他方法所抛出的异常,异常总是会丢回给调用方,会抛出异常的方法必须要声明它有可能会这么做。

34、编译器会检查所有异常,除了RuntimeException异常及其子类异常。

35、Java中处理异常可以使用try catch块,不处理异常时,异常会被抛出到上级调用方。

36、paintComponent (Graphics g)中的g实际上是一个Graphics2D对象。

37、内部类可以使用其外部类所有的方法和变量,就算是私有的也一样。

38、内部类实例一定会绑定在外部类实例上。

39、Java框架的默认布局是BorderLayout,面板的默认布局是FlowLayout,此外还有BoxLayout布局。

40、当对象被序列化时,被该对象引用的实例变量也会被序列化,且所有被引用的对象都会被序列化。

41、实现serializable接口的类可以被序列化,若某类可序列化,则其子类也自动地可以序列化。

42、如果某个类要实现序列化,那么其所有的子对象也必须实现序列化。或者声明transient。

43、如果某实例变量不能或不应该被序列化,就把他它标记为transient(瞬时)的。

44、父类没有标记为可序列化,子类也可以标记为可序列化的。

45、序列化可以判断两个实例变量是否指向同一个对象,如果是的话,序列化只会存储一份对象数据。

46、synchron ized 关键字来修饰方法,可以让它每次仅能被单一线程存取。

47、Thread. sleep()是一个静态方法,可以强制线程进入等待状态到过了设定的时间为止。

48、sleep()方法会抛出InterruptedException异常,所以要包在try/catch块中,或者把它也声明出来。

49、对象锁只会在对象带有同步化方法时才有实际的用途。

50、public <T extends Animal > void takeThing( ArrayList<T> list ),与public void takeThing( ArrayList<Animal> list)的区别:前者<T extends Animal >是方法声明的一部分,表示任何被声明为Animal 或Animal的子型的ArrayList 是合法的,后者是方法的参数是ArrayList< Animal > list.代表只有ArrayList<Animal>是合法的,也就是第一个可以使用任何一种Animal的ArrayList,
而第二个方法只能使用Animal的ArrayList。

51、以泛型的观点来说,extend代表extend 或implement,例如<T extends Comparable >,这里Comparable是一个接口,所以可以读作:“T 必须是有实现Comparable的类型”。

52、集合类中元素排序的比较规则:

(1)、调用单一参数的sort( list o)方法代表由list元素上的CompareTo()方法来决定顺序。因此元素必须要实现compareTo()这个接口。

(2)、调用sort( list o, Comparator c )方法代表不会调用list元素的CompareTo()方法,而会使用Comparator的Compare()方法。这意味着list元素不需要实现Comparable 接口。

53、引用相等性和对象相等性:

引用相等性是指是否是堆上同一个对象的两个引用,对象相等性是指是否是堆上的两个对象在意义上是相等的。

if(foo == bar )

{

//两个引用都指向同一个对象

}

if( foo.equals(bar) && foo. hashCode()== bar. hashCode() )

{

//两个引用指向同一个对象,或者两个对象是相等的

}

54、hashCode()与equals()的相关规定

*1、如果两个对象相等,则hashcode必须相等;

*2、如果两个对象相等,对其中一个对象调用equals()必须返回true.也就是说a.equals( b ) 则b.equals( a );

*3、如果两个对象有相同的的hashcode值。它们也不一定相等的,但若两个对象相等,则hashcode值一定是相等的;

*4、因此若equals()被覆盖过,则hashCode()也必须被覆盖;

*5、hashCode()的默认行为是对在heap上的对象产生独特的值。如果你没有overrider过hashCode(),则该class的两个对象怎样都不会被认为是相同的;

*6、equals()的默认行为是执行==的比较。也就是说会去测试两个引用是否对上heap上同一个对象。如果equals()没有被覆盖过,两个对象永远都不会被视为相同的,因为不同的对象有不同的字节组合。

55、数组的类型检查是在运行期间,但集合的类型检查只会发生在编译期间;

56、使用“万用字符”可以是集合接受子型参数

例如: public void takeAnimals( ArrayList<? extends Animal> animals )

{

for( Animal a : animals ){

a.eat();

}

}

在方法参数中使用万用字符时,编译器会阻止任何可能破坏引用参数所指集合的行为,也就是说,可以操作集合元素,但不能加入元素。

57、package com.headfirstjava;是将当前类加入包headfirstjava中的指令。

58、大部分完全在本机的java应用程序都是以可执行的JAR来部署的。

59、Java Web Start技术可以实现从网站来部署独立的客户端程序。

60、Java Web Start要求必须安装客户端的helper app(当然也需要Java)。

61、JWS程序由两个部分组成:可执行的JAR与.jnlp文件。

62、.jnlp文件是用来描述JWS应用程序的XML文件。它有tag以指定JAR的名称和位置,以及带有main()的类名称。

63、当浏览器从服务器上取得.jnlp文件时,浏览器就会启动JWS的helper app。

64、JWS的helper app会读取.jnlp文件来判断要从服务器上下载的可执行JAR。

65、取得JAR之后它就会调用.jnlp文件指定的main()。

66、(RemoteMethodInvocation, RMI)技术能够实现本机调用远程服务。

67、Java RMI提供客户端和服务端的辅助设施对象,在RMI中,客户端的辅助设施称为 stub, 而服务端的辅助设施称为skeleton。
68、远程方法的参数和返回值必须是primitive或Serializable的。因为任何远程方法的参数都会被打包通过网络传送,而这是通过序列化来完成的。
69、Servlet是Java写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态网页内容。
70、RMI是Java语言的一部分,所有的RMI相关类也在标准函数库中。而servlet和JSP则不是Java语言的一部分,也不被认为是标准的扩充套件。可以参看《Head First Servlets & JSP》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: