Head First Java 第二版

  • 不管你的程序有多大,一定都会有一个main()来作为程序的起点。
  • Java是强类型语言。
  • float f=23.5f    如果不加上f,就会被Java当做double处理。
  • 对于任意一个Java虚拟机来说,所有的引用大小都一样,但是不同的Java虚拟机可能会以不同的方式来表示引用。因此某个Java虚拟机的引用大小可能会大于或小于另一个Java虚拟机的引用。
  • Java是通过值传递的,也就是说通过拷贝传递。方法没办法改变调用方法所传入的参数。
  • 方法可以返回会被隐含转成声明类型的其他类型值。例如说用byte当做int类型的返回。但若声明的类型容器小于想要返回的类型时,必须作明确的转换。
  • 局部变量没有默认值。实例变量有默认值,例如0/0.0/false,引用的默认值是null。
  • 虽然ArrayList只能携带对象而不是primitive主数据类型,但编译器能够自动地将primitive主数据类型包装成Object以存放到ArrayList中。
  • 程序不会因为import而变大或变小。
  • 有三种方法可以防止类被继承:(1)存取控制。非公有的类智能被同一个包的类作出子类。(2)使用final修饰符。(3)构造函数为private。
  • 方法覆盖的要求:相同的参数和返回类型。存取权限必须相同或者更为开放。
  • 方法重载的要求:参数不同。
  • 抽象的方法必须存在于抽象类中。抽象方法的意义是就算无法实现出方法的内容,但还是可以定义出一组子型共同的协议。
  • 抽象类可以带有抽象和非抽象方法。
  • 任何从ArrayList取出的东西都会被当做Object类型的引用而不管它原来是什么。比如ArrayList<动物>放进去猫、狗,取出来的只能是动物,只能执行动物有的方法,不能执行猫和狗独有的方法。
  • 接口是100%纯天然抽象类。
  • 当调用一个方法时,该方法会放在调用栈的栈顶。
  • 方法调用和局部变量在栈里;所有对象都在堆里。
  • 如果没构造函数,编辑器会自动给加一个无参构造函数;构造函数没有返回值;构造函数不会被继承。
  • 如果自己写了一个有参数的构造函数,那么一定要再写一个没有参数的构造函数。
  • 如果一个类有一个以上构造函数,则参数一定要不一样,包括的参数的顺序与类型。
  • 在创建子类对象时,构造函数在执行的时候,第一件事就是去执行它的父类的构造函数,这会连锁反应到Object这个类为止,所有父类的构造函数都会被执行。
  • 调用父类的构造函数的唯一方式是:super()。super()的调用必须是构造函数的第一个语句。
  • 如果在构造函数中调用了this(),那么this()也必须是构造函数的第一个语句。
  • 在构造函数中super()和this()不能同时出现。
  • final的变相不能改变它的值。final的方法不能被覆盖。final的类不能被继承。final的变量要在声明的时候就赋值。
  • Java中唯一有重载的运算符是“+”,例如 String a = "" + d;
  • 异常处理规则:
  • 当有catch或者finally时,必须要有try;有try的时候,必须要有catch或者finally;如果只有try和finally,则方法必须要声明异常(void go() throws Exception...)。
  • 类被序列化需要implement Serializable。最好在类里加上serialVersionUID。
  • 如果实力变量不希望被序列化,则用transient标记。例如transient String aaa;
  • 使用泛型的方式:
    1. public class ArrayList extends AbstractList...{}
    2. public void takeThing(ArrayList list),注意本行的extends后面可以接类和接口都行。
    3. public static > void sort(List list)
    •  Collection API: 
    • 对象相等 

      如果两个对象相等,则hashcode必须相等。

      如果两个对象相等,则a.equals(b),而且b.equals(a)。

      如果两个对象的hashcode值相等,但他们不一定相等。

      如果覆盖了equals(),则也要覆盖hashcode()。

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

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

      a.equals(b)必须与a.hashCode()==b.hashCode()等值。

      但a.hashCode()==b.hashCode()时,a.equals()不一定等值。

    你可能感兴趣的:(java)