重读《Java编程思想(第四版)》(1-9章)

  毕业设计选了“Java虚拟机的实现“,在了解虚拟机的结构和工作原理之后,发现自己对Java语言也有了更加深刻的了解。因此,重读了大二时读过的《Java编程思想》,当时作为一个Java初学者来说(当然现在感觉依旧是,毕竟编的不够多)这并不是一本好书,很多概念无法理解,当时也更加偏向于语法知识。如今,重读这本Java的”圣经“,它却给我了很多惊喜,现在我把一些重要的点和以前没有注意到的记录到博客上。
  1.参数化类型,ArratList shapes 用于向下转型。
  2.对象引用存在于栈中,对象存在于堆中。基本类型存在于栈中。
  3.当变量作为类的成员使用时,Java确保给定其默认值。但对于局部变量, 不会确保初始化,但许多编译器会提醒你初始化。
  4.调用方法的行为通常被称为发送消息给对象。a.f()中,消息是f(),对象是a。”.”作为连接符发送消息。
  5.Java的包名均小写。
  6.对象的赋值只是修改引用(数组也是对象),对象作为函数参数也只是传递一个引用。(P40)
  7.关于对象的等价性请参考上一篇博文。
  8.equals()默认行为也是比较引用,所以除非在自己的新类中赋值equals()方法。
  9.多用于foreach()。for(float x:f)。
  10.一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()的方法(如果有finalize方法),,并且在下一次垃圾回收动作发生的时,才会真正的回收对象占用的内存。finalize()主要用于“本地方法”。
  11.(关于C++)如果在C++中创建一个局部对象(也就是在堆栈上创建),此时的销毁动作发生在以”右花括号“为边界的,此对象作用域的末尾处。如果对象是用new创建,那么当程序员调用C++的delete操作符时,就会调用相应的析构函数。如果程序员忘记调用delte,那么就永远不会调用析构函数。
  12.静态域在类加载时初始化(JVM ,P96)(注意static void main()函数也是静态域,且运行时第一个加载的就是main方法,所以该方法所在的类会第一个被加载)。、
  13.初始化的顺序是先静态对象(如果它们尚未因前面的对象创建而被初始化),而后就是“非静态”对象。(P96)
  14.总结一下对象的创建过程。(1)即使没有显式地使用static关键字,构造器实际上也是静态方法。因此首次创建对象时。。。先执行所有出现于字段定义处的初始化动作,再执行构造器(P96)。
  15.静态块最先执行,有时候在静态字段中直接赋值,编译器会变成静态块。
  16.构造块使得你可以保证无论调用那个显式构造器,某些操作都会发生。且构造块先于构造器执行。
  17.可变参数类型,如String..args。不用Object显式向下转型(P102)。
  18.enum可以把它当做特殊的类。它会创建toString()方法,还有ordinal()方法以及static value(),返回数组。
  19.不提供任何访问权限修饰词,则意味着它是“包访问权限”。这意味着当前包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类,这个成员却是private。(一般类有两种权限。public和包访问权限)。
  20.在定义对象的地方初始化,这意味着它们总是能够在构造器被调用之前被初始化。
  21.如果基类时有参构造器(且无默认的无参构造器),则在派生类的构造器中必须第一步就用super调用基类的有参构造器。
  22.在finally子句中做一些清理动作(并非消除对象),以防异常的出现。(P133)
  23.导出类可以进行重载。可以用@Override注解防止在不想重载时而意外地进行了重载。(P136)
  24.组合技术通常用于想在新类中使用现有类的功能而非它的接口的这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非嵌入对象的接口。为了取得此效果,需要在新类中嵌入一个现有类的private对象。
  25.向上转型:类接口中唯一可能发生的事情就是丢失方法,而不是获取它们(这也是编译器允许向上转型)。向下转型:是获取方法,所以需要指明类型。
  26.判断使用组合还是继承的一个最清晰的方法就是问一问自己是否需要从新类向基类进行向上转型。如果必须向上转型,则继承是必要的;但如果不需要,则应当好好考虑自己是否需要继承。
  27.final:1.一个永不改变的编译常量。2.一个在运行时被初始化的值,而你不希望它被改变。 一个既是static又是final的域只占据一段不能改变的存储空间。(final变量一般都大写)
  28.final对于对象引用(包括数组):对于基本类型,final使数值恒定不变,而对于引用,是不能改变指向。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而对象自身却是可以修改的。 
  29.必须在域的定义处或者每个构造器中用表达式对final进行赋值。
  30.final用于方法,可以把方法锁定,以防任何继承类修改它的含义。类中所有的private方法都隐式地指定为是final的。由于无法取用private方法,所以也就无法覆盖它。final用于类,表明不打算继承该类。
  31.(P146)例子补充:在类加载阶段静态域就会被初始化(包括父类,因为类解析阶段会递归解析到父类)。在对象创建阶段,先初始化父类,再初始化子类。即使子类中有构造块,定义处初始化。
  32.Shape[] s = new Shape[9];只是产生一个由Shape引用组成的数组,并没有给引用联系上对象。
  33.构造器的调用顺序:0)在任何事物发生之前,将分配给对象的存储空间初始化成为二进制的零。1)调用基类构造器。这个步骤会不断地反复递归下去。2)按声明顺序调用成员的初始化方法。3)调用导出类构造器的主体。(P163)
  34.在基类的构造器中调用了方法仍然会有多态行为(相当于在invoke special中调用invoke virtual,因为均已加载所以仍然会发生多态),但某些字段仍然可能是二进制的零。(P163)
  35.接口和类一样,也只有public权限和包访问权限。接口中的域隐式地是static和final的,接口中的方法必须是public(即使不声明为public,也会自动被定义为public)。
  36.各种设计模式。至201页一共有7种设计模式。 1)代理模式(P130)。2)状态模式(P165)。3)适配器模式(P177)。4)策略设计模式。5)单例模式(P122)。6)迭代器模式(P192)。7)工厂模式(P186)改进的工厂模式(P199)。

你可能感兴趣的:(java语言)