Java后端八股笔记1 Java基础

24 阅读6分钟

Java基础

编译性语言与解释型语言

编译性语言解释性语言
解释通过编译器将整个源代码编译成机器码或字节码,执行时直接运行编译后的代码有解释器逐行解释并执行代码
开发效率
执行效率
代表Java(字节码),C,C++(机器码)Python,Javascript

Java特点

  1. 平台无关性:编写一次,运行无处不在,Java编译器将源代码翻译成字节码(bytecode),该字节码可以在任何安装了Java虚拟机(JVM)的系统上运行
  2. 面向对象:严格的面向对象编程语言,几乎一切都是对象。
  3. 内存管理:有自己的垃圾回收机制,自动管理内存和回收不再使用的对象。

JDK VS JRE

JDK(Java开发工具包 ):开发Java程序所需的工具合集,包含JVM,编译器(javac),调试器(jdb)等开发工具,以及一系列类库。

JRE(Java运行时环境):Java程序运行的最小需要环境,包含JVM与一组类库,不包含开发环境

数据类型

基本数据类型:

基本数据类型占用大小(字节)
byte1
short2
int4
long8
float4
double8
char2
boolean1位(根据不同JVM而定)

异常

Throwable:

  1. Exception:程序本身可以处理的异常
    1. 运行时异常(不受检查异常):由程序错误导致,如空指针访问(NullPointerException)、数组越界(ArrayIndexOutOfBoundsException)等。不需要在编译时强制捕获或声明的。
    2. 非运行时异常(受检查异常):这类异常在编译时期就必须被捕获或者声明抛出。它们通常是外部错误,如文件不存在(FileNotFoundException)、类未找到(ClassNotFoundException)等。
  2. Error:程序无法处理的错误,例如:Java虚拟机运行错误,内存不够错误,这些错误发生时JVM一般选择线程终止

异常处理:

  • try-catch语句块:用于捕获并处理可能抛出的异常。try块中包含可能抛出异常的代码,catch块用于捕获并处理特定类型的异常。可以有多个catch块来处理不同类型的异常。
  • throws:用于在方法声明中声明可能抛出的异常类型。如果一个方法可能抛出异常,使用throws关键字将异常传递给调用者来处理。

面向对象

三大特性

  1. 继承:提供一个复用父类的方法,使得子类可以共享父类的方法与数据
  2. 封装:将对象内部的数据和方法与外界结合起来,对外隐藏内部细节,仅提供一些接口进行交互
  3. 多态:同一接口对于不同实例做出不同的操作
    1. 编译时多态:方法重载,即同一类中允许存在多个同名方法,每个方法都有不同的参数列表,允许方法对于传入的不同的参数产生不同的行为(编译器决定)。
    2. 运行时多态:方法重写,即子类重写父类方法(对同名方法的具体实现)(JVM在运行时决定)

接口与抽象类

共同点:不能被实例化,都可以有抽象方法,都可以有默认方法(Java8)

不同点:

抽象类接口
解释定义行为规范描述类的共同行为
内部可以存在方法实现只能有方法声明
继承方面只能继承一个抽象类可以实现多个接口
成员变量默认为public static final,必须赋初值,不能修改默认为abstract,可以修改

关键字

static关键词:将该成员与类本身相关,而非与实例相关

final关键字:修饰类不能被继承,修饰方法不能被重写,修饰变量1.基本类型不能被修改2.引用类型不能指向别的对象,但可以修改内部置

拷贝

image.png 引用拷贝:两个引用指向同一个对象。

浅拷贝:创建一个新的对象,并复制原对象内的引用地址

深拷贝:创建一个新的对象,并创建内部的引用对象

String与Object

String、StringBuffer、StringBuilder

特性StringStringBufferStringBuilder
线程安全安全(不可变:使用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用于构造方法