HeadFirst

基础知识

java Java编译器运行java源代码并产生字节码文件。
java 虚拟机来运行java字节码文件。

对象和类

对象有状态(实例变量)和行为(方法)两种属性,行为存在于类中,而状态存在于个别的对象中。

虚拟机

在操作系统的角度就是一个进程
class文件不是二进制文件,但是java虚拟机相对于操作系统就是一个进程,他与os的交互时会转换为二进制码。

加载class文件是通过虚拟机的类加载器的子系统完成的

虚拟机中的执行引擎来执行class文件中的字节码指令

虚拟机的垃圾收集子系统自动回收无用的垃圾

Setter$Getter

相当于给变量穿上了一条‘裤子’。起到过滤,保护的作用

ArrayList

不能存放基本数据类型,存放的是自动包装过的。
若不指定泛型,则可以存放不同数据的类型。

实例变量与局部变量

  • 实例变量声明在类中,局部变量声明在方法中
  • 实例变量不初始化系统会给初始值(integer:0,float:0.0, booleans:false, references:null)
  • 局部变量使用前必须初始化,否则编译器会报错

equal() 与 ==

在比较基本类型时,都一样。
比较引用类型是,equal比较的是具体的数据。==比较的是其引用。

包的导入

  • 除了java.lang之外,使用其他包的类都需要导入。他是预先被引入的包,因为经常会被用到
  • import只是帮你省下每个类前面的包名而已,不会把程序变大

继承

使用Object类型的(其他的也一样)多态引用是有代价的。
比如Arrayist放东西,无论放什么对象都会转换为Object。

别忘记了通过super可以调用父类中的方法,即使子类中也已经重写的此方法,也可以通过super调用的到父类中的此方法。

多态

  1. 类只有publicdefault
  2. 类中的(toString,equals,hashCode…)都是Object的方法。
  3. 防止类被继承的三种方法:
    1.default声明的类,只能被同一包的类做出子类
    2.使用final,表示它是继承树的末端,不能被继承
    3.让类只有private构造方法(标志后不能被继承和实例化)
    (疑问:怎样解决参数多态时,得到子类中自己的方法 –》挨个判断,用父类instanceOf子类来判断,然后强制类型转换)

方法重载

但参数列表不同(可能是,参数个数不同参数类型不同)跟返回值无关。
可以任意的修改方法的存取权限

Abstract

生动的解说:你无法画出Animal的形状,所以把Animal定义为抽象的.

抽象类:只能被继承,不能实例化。

抽象方法:没有方法体。类中若包含抽象方法,此类必声明为抽象类。
且,抽象方法在子类中必须被实现。
(很好理解,如果不声明为抽象类,代表可以实例化塔,可是抽象方法没有方法体,无法执行。)

接口

若两个接口中有相同的方法,实体类中只重写一个就可以。因为反正都是没实现的东西,无所谓。但是抽象类就完全不可以,这也是需要接口出现的一个原因。

接口中的方法其实前面的(public abstract)自动省略掉了。

构造函数

对super()的调用必须是构造函数的第一个语句。
若没有加super(), 编译器会自动帮你加上。
使用this()来从某个构造函数调用同一个类中的另外一个构造函数。
this()只能用在构造函数中,且必须是第一行语句(所以和super不可共存,都必须放到第一条)

静态方法

静态方法不能调用非静态方的变量。
静态的方法是在无关特定的实例状况下执行的。甚至不会有该类的实例额出现。因为他是通过类的名称来调用,所以静态的方法无法引用到该类的任何实例变量,在此情况下,静态的方法也不会知道可以使用哪个实例变量的值。

Final

final 的变量代表你不能改变它的值。
final 的method代表你不能重写该method。但可以重载(同一类)
final 的类代表你不能继承该类(创建其子类)。

Exception

异常分为受检测异常和运行时异常。运行时异常可try也可以不try。因为这是业务相关的东西,也如空指针之类的,(空指针哪里都可能发生,不能哪里都try catch 吧)。

Thrawable(getMessage(), printStackTrace()) -》
Exception -》各种异常 和 RuntimeException

finally是无论如何都要执行的部分,如果try货catch有return的指令,finally还是会执行,流程会跳到finally然后再回到return指令。try一定要有catch 或者 finally。如果只有finally没有try也可以,不过不当做是一次正常的catch,还需要throw 异常。

抛出多个异常时,可以有多个catch,不过要把“小篮子”放上面,依次放,最后放最大的“篮子”。

main方法也可以把异常抛出,不过这样虚拟机就会挂掉。

疑问

  1. == 与 equals 区别。
    源码中看到
    public boolean equals(Object obj) {
    return (this == obj);
    }. 所以区别在哪里?
  2. hascode 就是指针的值吗?
  3. 接口和抽象类有构造函数吗?
  4. 接口可以定义成员变量吗,起作用是什么?

答案

4: 抽象类有,创建子类对象时会被自动调用,也可以定义成员变量。与类相同。接口没有

5: 接口不能定义变量,只可以定义常亮,默认为public static final 类型。

猜你喜欢

转载自blog.csdn.net/zhaorubinsujia/article/details/80489871