Contents
  1. 1. 1~3章

tips:

1~3章

  1. null表示引用还没赋值
  2. ==比较的是对象的引用,比较对象实际内容是否相同需要用equals()(自己的类需要重新覆盖)
  3. byte或者short作移位运算时可能得到不正确的结果。因为会先被转换为int类型再进行移位操作,然后再阶段,赋值给原来类型。
  4. 通常表达式中出现的最大数据类型决定了表达式最终结果的数据类型。
  5. java没有sizeof,因为所有的数据类型在所有的机器中的大小是相同的。
  6. 扩展转换通常不需要显式进行,但窄化转换就不行。
  7. static方法内部不能调用非静态方法,反过来可以
  8. finalize()用于释放不是由new分配的内存,不是析构函数!!!下一次GC时候才回收内存。
  9. 引用计数一般来说明GC而已,但是实际上没有JVM采用?

  10. 构造器初始化顺序:

    • 在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之内,它们仍会在任何方法,包括(构造器)被调用之前得到初始化。
    • 静态初始化只有在必要时刻才会进行。只有第一次访问静态变量时候会被初始化,此后静态变量不会再次被初始化。
    • 初始化的顺序是先静态对象(如果它们尚未因前面的对象创建过程而被初始化),而后是非静态对象。
    • 每个.java文件只能有一个public类,否则编译器不接受。
    • public类的名称必须与文件名相匹配,包括大小写
    • 编译单元完全不带public类也是可以。在这情况下,可以随意对文件命名。
    • 类的访问权值只能是包访问或者public,不能是private。如果不希望任何人拥有访问权限,可以所有构造器都是private
  11. 访问权限的等级:public > protected > 包访问权限(没有关键词) > private
    没有加任何访问词就是默认包访问。
  12. overload 重载(参数不同);override 覆写(覆写父类的方法)
  13. 组合和继承的选择:

    • “is a”用继承,“has a” 用组合
    • 继承应该慎用,向上转型是必要的话就用继承,否则需要考虑一下。
    • 通用的准则:用继承表示行为间的差异,并用组合表示状态上的变化
  14. java中除了static方法和final方法(private属于final方法)之外,其他所有的方法都是后期绑定。

  15. java继承中的缺陷:

    • 只有非private方法才可以被覆盖。但是还需要密切的注意覆盖的private方法的现象,这是虽然编译器不会报错,但是也不会按照我们所期望的来执行。确切的说,在导出类中,对于基类中的private方法,最好采用不同的名字。
  16. 属性、方法、构造方法和自由块都是类中的成员,在创建类的对象时,类中各成员的执行顺序:

    1. 父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
    2. 子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
    3. 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。
    4. 执行父类的构造方法。
    5. 子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
    6. 执行子类的构造方法。

构造器的调用顺序:

1. 调用基类构造器(不断递归到根,从根开始调用构造器)
2. 按声明顺序调用成员的初始化方法
3. 调用导出类构造器的主体

销毁的顺序和初始化的顺序相反。

  1. 什么是多态

面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
同一个事件发生在不同的对象上会产生不同的结果。

多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。

多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.

方法调用的优先问题 :优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)

  1. 构造器内部的多态方法的行为。
    在构造器内唯一能够安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final类)。这些方法不能被覆盖就不会产生构造器多态的问题。

  2. 一般情况下,只可以将extends用于单一类,但是可以用于多个基类接口。

  3. 数组和泛型通常不能很好的结合。因为擦除会移除参数类型信息,而数组必须知道他们所持有的确切类型,以强制保证类型安全。

  4. Arrays的实用功能
    复制数组:System.arraycopy(源数组,开始索引,目标数组,开始索引,复制个数)
    数组比较:Arrays.equals() 基于内容
    数组排序:Arrays.sort() 正序,逆序Arrays.sort(数组,Collections.reverseOrder()(也可以是自己实现的排序的类)) 还可以自己实现Comparable接口

(java里面对基本类型是快排,对对象是归并排序)
查找:Arrays.binarySearch()

  1. HashMap采用对象的hashCode进行快速查询,能显著提高性能。
Contents
  1. 1. 1~3章