Java基础
编译性语言与解释型语言
| 编译性语言 | 解释性语言 | |
|---|---|---|
| 解释 | 通过编译器将整个源代码编译成机器码或字节码,执行时直接运行编译后的代码 | 有解释器逐行解释并执行代码 |
| 开发效率 | 慢 | 快 |
| 执行效率 | 快 | 慢 |
| 代表 | Java(字节码),C,C++(机器码) | Python,Javascript |
Java特点
- 平台无关性:编写一次,运行无处不在,Java编译器将源代码翻译成字节码(bytecode),该字节码可以在任何安装了Java虚拟机(JVM)的系统上运行
- 面向对象:严格的面向对象编程语言,几乎一切都是对象。
- 内存管理:有自己的垃圾回收机制,自动管理内存和回收不再使用的对象。
JDK VS JRE
JDK(Java开发工具包 ):开发Java程序所需的工具合集,包含JVM,编译器(javac),调试器(jdb)等开发工具,以及一系列类库。
JRE(Java运行时环境):Java程序运行的最小需要环境,包含JVM与一组类库,不包含开发环境
数据类型
基本数据类型:
| 基本数据类型 | 占用大小(字节) |
|---|---|
| byte | 1 |
| short | 2 |
| int | 4 |
| long | 8 |
| float | 4 |
| double | 8 |
| char | 2 |
| boolean | 1位(根据不同JVM而定) |
异常
Throwable:
- Exception:程序本身可以处理的异常
- 运行时异常(不受检查异常):由程序错误导致,如空指针访问(
NullPointerException)、数组越界(ArrayIndexOutOfBoundsException)等。不需要在编译时强制捕获或声明的。 - 非运行时异常(受检查异常):这类异常在编译时期就必须被捕获或者声明抛出。它们通常是外部错误,如文件不存在(
FileNotFoundException)、类未找到(ClassNotFoundException)等。
- 运行时异常(不受检查异常):由程序错误导致,如空指针访问(
- Error:程序无法处理的错误,例如:Java虚拟机运行错误,内存不够错误,这些错误发生时JVM一般选择线程终止
异常处理:
- try-catch语句块:用于捕获并处理可能抛出的异常。try块中包含可能抛出异常的代码,catch块用于捕获并处理特定类型的异常。可以有多个catch块来处理不同类型的异常。
- throws:用于在方法声明中声明可能抛出的异常类型。如果一个方法可能抛出异常,使用throws关键字将异常传递给调用者来处理。
面向对象
三大特性
- 继承:提供一个复用父类的方法,使得子类可以共享父类的方法与数据
- 封装:将对象内部的数据和方法与外界结合起来,对外隐藏内部细节,仅提供一些接口进行交互
- 多态:同一接口对于不同实例做出不同的操作
- 编译时多态:方法重载,即同一类中允许存在多个同名方法,每个方法都有不同的参数列表,允许方法对于传入的不同的参数产生不同的行为(编译器决定)。
- 运行时多态:方法重写,即子类重写父类方法(对同名方法的具体实现)(JVM在运行时决定)
接口与抽象类
共同点:不能被实例化,都可以有抽象方法,都可以有默认方法(Java8)
不同点:
| 抽象类 | 接口 | |
|---|---|---|
| 解释 | 定义行为规范 | 描述类的共同行为 |
| 内部 | 可以存在方法实现 | 只能有方法声明 |
| 继承方面 | 只能继承一个抽象类 | 可以实现多个接口 |
| 成员变量 | 默认为public static final,必须赋初值,不能修改 | 默认为abstract,可以修改 |
关键字
static关键词:将该成员与类本身相关,而非与实例相关
final关键字:修饰类不能被继承,修饰方法不能被重写,修饰变量1.基本类型不能被修改2.引用类型不能指向别的对象,但可以修改内部置
拷贝
引用拷贝:两个引用指向同一个对象。
浅拷贝:创建一个新的对象,并复制原对象内的引用地址
深拷贝:创建一个新的对象,并创建内部的引用对象
String与Object
String、StringBuffer、StringBuilder
| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 线程安全 | 安全(不可变:使用final修饰字符数组,修改时为创造一个新实例) | 不安全 | 安全(通过synchronized修饰方法) |
| 性能 | 低(需频繁创建) | 高 | 中 |
| 使用场景 | 静态字符串 | 单线程动态字符串 | 多线程动态字符串 |
equals()与hasCode()
- equals():
- 在字符串中比较的是两个字符串的内容,属于内容比较。
- 在非字符串中,比较的是在内存中的首地址,即用来比较两个引用变量是否指向同一个对象
- hasCode():获取哈希码,确定该对象在哈希表中的索引位置
在 Java 中,对于重写 equals 方法的类,通常也需要重写 hashCode 方法,并且需要遵循以下规定:
- 一致性:如果两个对象使用
equals方法比较结果为true,那么它们的hashCode值必须相同。 - 非一致性:如果两个对象的
hashCode值相同,它们使用equals方法比较的结果不一定为true。
反射
在运行过程中,对任意类,都能知道他的内部属性与方法;对任意一个对象,都能调用他的实行与方法。
提供了运行时分析与执行类的能力
应用场景:
- 动态代理
- 注解:运行时通过反射获得类中方法上的注解来进行对应操作
注解
注解本质上是一种特殊的接口,继承自 java.lang.annotation.Annotation 接口,所以注解也叫声明式接口
从JVM的角度看,注解本身对代码逻辑没有任何影响
@Retention
用于指定注解的保留策略,即注解在哪个阶段保留,属性的值由枚举类
| 名称 | 说明 | |
|---|---|---|
SOURCE类型 | 编译器使用的注解 例如: @Override:让编译器检查该方法是否正确地实现了覆写 | 这类注解在编译后就被编译器扔掉了。 |
CLASS类型 | 处理.class文件使用的注解 | 这类注解会被编译进入.class文件,但运行时不可见。 |
RUNTIME类型 | 在程序运行期能够通过反射读取的注解 | 在加载后一直存在于JVM中。 |
@Target
用于指定注解可以应用的Java元素类型,例如类、方法、字段,属性的值由枚举类
| 字段 | 说明 |
|---|---|
| TYPE | 用于类、接口、注解、枚举 |
| FIELD | 用于字段(类的成员变量),或者枚举常量 |
| METHOD | 用于方法 |
| PARAMETER | 用于方法或者构造方法的参数 |
| CONSTRUCTOR | 用于构造方法 |