面试必备JAVA基础-学习笔记(未完待续)

技术面试基础知识——Java相关基础的学习笔记整理。

1.前言

这里是对于CS-Notes中整理的与JAVA相关的基础知识的学习和补充记录。

2.Java基础

(1)数据类型

基本类型与包装类型

Java基本类型和包装类型总结

缓存池

Java自动装箱、拆箱及缓存池

(2)String

String, StringBuffer and StringBuilder

String,StringBuffer和StringBuilder

javap反编译java语言

Java命令学习系列(7):Javap
通过javap命令分析java汇编指令

Java字节码基础

轻松看懂Java字节码

关于Kotlin

一种与Java、Android 100%兼容的编程语言,简洁。

Kotlin是什么
使用 Kotlin 进行 Android 开发

(3)运算

参数传递

Java 的参数是以值传递的形式传入方法中,而不是引用传递。关于这一点,详细的解释见下图。

Is Java “pass-by-reference” or “pass-by-value”?

(4)继承

访问权限

Java 中有三个访问权限修饰符:private、protected 以及 public,如果不加访问修饰符,表示包级可见。

浅析Java中的访问权限控制

里氏替换原则

六大设计原则之里氏替换原则(LSP)

抽象类与接口

抽象类

  1. 抽象类和抽象方法都使用 abstract 关键字进行声明。如果一个类中包含抽象方法,那么这个类必须声明为抽象类。
  2. 抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类。

接口

  1. 接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。
  2. 从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。
  3. 接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected
  4. 接口的字段默认都是 staticfinal 的。

比较二者

  • 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
  • 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
  • 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
  • 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。

java 面向对象关系is-a has-a like-a

在很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。

super

Using the Keyword super

重写与重载

重写

存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法。

为了满足里式替换原则,重写有以下三个限制:

  • 子类方法的访问权限必须大于等于父类方法。
  • 子类方法的返回类型必须是父类方法返回类型或为其子类型。
  • 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型。

使用 @Override 注解,可以让编译器帮忙检查是否满足上面的三个限制条件。

在调用一个方法时,先从本类中查找看是否有对应的方法,如果没有查找到再到父类中查看,看是否有继承来的方法。否则就要对参数进行转型,转成父类之后看是否有对应的方法。总的来说,方法调用的优先级为:

  • this.func(this)
  • super.func(this)
  • this.func(super)
  • super.func(super)

重载

  1. 存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。
  2. 应该注意的是,返回值不同,其它都相同不算是重载。

5.Object 通用方法

Java类层次结构的顶层是Object类,所有的其他类都隐式的继承于它。因此,所有的类也都从Object中继承了方法,其中最重要的几个方法如下。

  • public native int hashCode()
  • public boolean equals(Object obj)
  • protected native Object clone() throws CloneNotSupportedException
  • public String toString()
  • public final native Class<?> getClass()
  • protected void finalize() throws Throwable {}
  • public final native void notify()
  • public final native void notifyAll()
  • public final native void wait(long timeout) throws InterruptedException
  • public final void wait(long timeout, int nanos) throws InterruptedException
  • public final void wait() throws InterruptedException

Java进阶2 —— 使用Object的通用方法

6.关键字

(1)final

一、数据

声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。

  • 对于基本类型,final 使数值不变;
  • 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。

二、方法

声明方法不能被子类重写。

private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。

三、类

声明类不允许被继承。

(2)static

7.反射

反射最重要的用途就是开发各种通用框架。

Trail: The Reflection API
深入解析Java反射(1) - 基础

8.异常