语法基础
多态
多态主要指继承父类和实现接口时,可使用父类引用指向子类对象。
运行时多态的实现主要依靠方法表,方法表中最先存放的是 Object 类的方法,接下来是该类的父类的方法,最后是该类本身的方法。
如果子类改写了父类的方法,那么子类和父类的那些同名方法共享一个方法表项,都被认作是父类的方法。因此可以实现运行时多态。
重载与重写
重写是父类与子类之间的关系,是垂直关系;重载是同一类中方法之间的关系,是水平关系。
重写要求方法签名相同;重载要求方法签名不同。
方法重写的限制条件:
static 关键字
修饰变量
用 static 关键字修饰的静态变量在内存中只有一个副本。
只要静态变量所在的类被加载,这个静态变量就会被分配空间。
可以使用“类.静态变量”和“对象.静态变量”的方法使用。
修饰方法
static 修饰的静态方法无需创建对象就可以被调用。
static 方法中不能使用 this 和 super 关键字,不能调用非 static 方法,只能访问所属类的静态成员变量和静态成员方法。
修饰代码块
JVM 在加载类的时候会执行 static 代码块。
static 代码块常用于初始化静态变量。
static 代码块只会被执行一次。
修饰内部类
static 内部类可以不依赖外部类的实例对象而被实例化。
静态内部类不能与外部类有相同的名字,不能访问普通成员变量,只能访问外部类中的静态成员和静态成员方法。
final、finally 和 finalize
final 是一个修饰符,可以修饰变量、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。
finally 作为异常处理的一部分,只能在 try/catch 语句中使用,finally 附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的 finalize() 方法。当垃圾回收器准备好释放对象占用的内存空间时,首先会调用 finalize() 方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。
判等运算符 == 与 equals 的区别?
== 比较的是引用,equals 比较的是内容。
如果变量是基础数据类型,== 用于比较其对应值是否相等。如果变量指向的是对象,== 用于比较两个对象是否指向同一块存储空间。
equals 是 Object 类提供的方法之一,每个 Java 类都继承自 Object 类,所以每个对象都具有 equals 方法。Object 类中定义的 equals 方法在内部直接调用 == 进行比较,而通过重写 equals 方法可以让它不是比较引用而是比较对象内容。
Java 的基本数据类型
整型:byte、short、int、long
浮点型:float、double
字符型:char
布尔型:boolean
自动装箱与拆箱
对于 Java 基本数据类型,均对应一个包装器类。
装箱就是自动将基本数据类型转换为包装器类型,如 int -> Integer
拆箱就是自动将包装器类型转换为基本数据类型,如 Integer -> int
String、StringBuffer 与 StringBuilder
一个 String 对象在 Java 中表示一个字符串常量,是一个不可变对象,任何修改 String 的操作都不会改变原有的字符串,而是会生成一个新的字符串对象。
StringBuffer 和 StringBuilder 均是工具类,主要用于构造字符串,减少频繁修改字符串导致创建过多的字符串对象。两者的区别主要在于 StringBuffer 具有线程安全性,而 StringBuilder 并不具有线程安全性。
Object 类常用方法
hashCode:返回对象的散列码,一般当对象作为 HashSet 中的元素或 HashMap 中的键时,需要重写该方法。
equals:判断两个对象是否相等,需保证 equals 结果为 true 的两个对象的 hashCode 值也一样。
toString:返回对象的字符串表示。
clone:克隆一个对象,需要实现 Clonable 接口该方法才能使用。
wait:当调用该方法时,当前线程会被放入对象的条件队列中进行等待,并释放对象锁。
notify / notfiyAll:当调用该方法时,会唤醒在对象条件队列中等待的线程。其中 notify 会唤醒其中某一个线程,而 notifyAll 则会唤醒所有线程。
最后更新于