note · 4,358

Java 基础

Java 基础:数据类型、接口与抽象类、重载重写、异常、泛型、反射、注解。

Java笔记

Java基础

介绍Java 优势

  • 平台无关性:JVM Java源码 - .class字节码文件 - 通过JVM翻译成机器码 一次编译到处运行
  • 面向对象:封装(encapsulation) 继承(inheritance) 多态(polymorphism)
    • 多态 - 重载、重写、接口与实现、父类与子类
  • 内存管理:垃圾回收机制
  • (可选)开源 强大生态系统
  • (劣势)速度稍微慢

有哪些数据类型

  • 基本类型 8种 byte short int long 浮点float double 字符char 布尔boolean
  • 引用类型 类 接口 数组

接口和抽象类有什么区别

接口就是一个纯的抽象类,Java发展中先有的抽象类,再有的接口

抽象类(Abstract Class)本质是 “部分实现的类” 怎么做

接口(Interface)本质是 “行为规范的集合” 能做什么 作为程序员,最应该关心怎么做

而作为架构师,最应该该关心做什么

抽象类

  • 抽出共享

  • 实现重复功能

  • 多态性

  • 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。

  • 接口可以多继承,抽象类不行。

  • 接口定义方法,不能实现,默认是 public abstract,而抽象类可以实现部分方法。

  • 接口中基本数据类型为 public static final 并且需要给出初始值,而抽类象不是的

接口中可以实现的方法类型有

抽象方法 (Abstract Methods)

默认方法 (Default Methods) - (Java 8+ 新增) default 如果你在一个被上千个类实现的接口中增加一个新方法,那么所有实现类都必须立即重写这个方法,否则程序无法编译。 默认方法可以不重写直接调用。

静态方法 (Static Methods) - (Java 8+ 新增)

私有方法 (Private Methods) - (Java 9+ 新增)

私有静态方法 (Private Static Methods) - (Java 9+ 新增)

重载和重写的区别

常见的异常有哪些?

  • Error 表示严重的问题,通常是Java虚拟机(JVM)或硬件/系统层面发生的故障,这些问题是应用程序无法控制和恢复的
  • Unchecked Exception 即 RuntimeException
    • NullPointerException 空指针异常
    • ArrayIndexOutOfBoundsException 数组索引越界异常
    • IllegalArgumentExcepiton 非法参数异常
  • Checked Exceptions
    • IOException
    • SQLException
    • ClassNotFoundException

异常要怎么解决

  • try-catch-finaly try和finaly都有return 最终会return finaly的内容
  • throw 主动抛出异常
  • throws 声明方法可能抛出的异常类型

什么是泛型

把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型

目的:代码复用 和 类型安全(自己进行强转容易出问题)

什么是泛型擦除

因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。 擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。

Integer a = 1000,Integer b = 1000,a==b 的结果是什么?那如果 a,b 都为1,结果又是什么?

前者为False 后者为True 考察包装类的缓存机制

  • Byte, Short, Int,Long: 默认缓存范围都是 -128 到 127(它们的上限不可配置)。
  • Character: 缓存范围是 0 到 127。
  • Boolean: 缓存 truefalse 两个实例。
  • Float, Double:没有缓存机制。

介绍一下反射

Java 反射机制是在运行状态中,对于任意一个,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。 (也可以获得一个类上的注解)

Spring 的依赖注入(Dependency Injection, DI)机制主要基于 Java 反射(Reflection)实现

  • Bean的实例化依赖注入

Spring 容器在创建 Bean 时,会通过反射获取类的Class对象,然后根据 Bean 定义(如构造函数参数)选择合适的构造函数(Constructor),通过newInstance()invoke()方法创建对象。

  • 字段注入

当使用@Autowired注解在字段上时,Spring 会:

  • 通过Class.getDeclaredField(字段名)获取字段(包括私有字段);
  • 调用field.setAccessible(true)突破访问权限限制;
  • field.set(对象, 值)直接为字段赋值,完成注入

注解

@Interface

Public Protected Private

  • Public :完全公开
  • Protected :对“自家人”和“子孙”开放
  • private : 绝对私有

HTTP状态码

1xx (信息性): 表示请求已被接收,继续处理。

2xx (成功): 表示请求已成功被服务器接收、理解、并接受。

3xx (重定向): 表示需要客户端采取进一步的操作才能完成请求。

4xx (客户端错误): 表示客户端的请求有语法错误或请求无法实现。

  • 400 Bad Request 服务器无法理解客户端的请求,通常是因为语法错误
  • 401 Unauthorized 未授权 没带Token或Token过期
  • 403 Forbidden 禁止访问 可能没有权限
  • 404 Not Found 服务器上找不到请求的资源

5xx (服务器错误): 表示服务器未能实现合法的请求。

  • 500 Internal Server Error: 通用的代码,表示服务器遇到了一个无法处理的意外情况 后端报错
  • 502 Bad Gateway: 网关错误。服务器作为网关或代理,从上游服务器收到了无效的响应。
  • 503 Service Unavailable: 服务不可用。服务器暂时无法处理请求,通常是因为过载或正在进行停机维护。
  • 504 Gateway Timeout:网关超时

Object类提供了哪些基础方法

  • equals hashCode
  • toString``getClass
  • Concurrency方法 wait``notify``notifyAll

为什么重写 .equals() 时,必须重写 hashCode()

  • 契约(Contract)规定:Java 规范要求,如果两个对象通过 .equals() 比较是相等的,那么它们的 hashCode() 返回值必须相等
  • 在集合中的实际影响:当你把自定义对象作为键(Key)存入基于散列表的集合(如 HashMapHashSet)时,集合会先调用对象的 hashCode() 来计算它在数组中的存放位置(Bucket)。
  • 如果不重写的灾难:假设你有一个 User 类,只重写了 .equals(),规定只要 ID 相同就是同一个用户。
    • 你创建了 User u1 = new User(1); 并将其存入 HashMap
    • 接着你又创建了 User u2 = new User(1);,想用它把之前存的值取出来。
    • 因为你没重写 hashCode()u1u2 的哈希值默认由内存地址计算得出,大概率不同。
    • HashMap 会拿着 u2 的哈希值去另一个数组位置找,结果找不到(引发内存泄漏或业务逻辑错误),尽管 u1.equals(u2) 是 true。

为什么会考虑用 iterator 去遍历,而不是,只用 for i 就行?

  1. 并非所有的集合都有索引!
  2. 在删除元素的情况下 Iterator更安全
  3. For-each本质上iterator的语法糖

Stream流

名称说明
Stream<T> filter(Predicate<? super T> predicate)过滤
Stream<T> limit(long maxSize)获取前几个元素
Stream<T> skip(long n)跳过前几个元素
Stream<T> distinct()元素去重,依赖 (hashCode 和 equals 方法)
static <T> Stream<T> concat(Stream a, Stream b)合并 a 和 b 两个流为一个流
Stream<R> map(Function<T, R> mapper)转换流中的数据类型

.filter(e -> "R&D".equals(e.getDepartment()))

RESTful API设计规范

  1. 核心原则 URI面向资源
    1. 在 REST 架构中,网络上的所有事物都被抽象为“资源”。URI(统一资源标识符)应该只包含名词,不要包含动词
    2. 正确: /users, /articles, /products
    3. 错误: /getUser, /createArticle, /product-list
  2. HTTP 动词:定义操作 (Methods)
    1. GET /users -> 获取用户列表
    2. GET /users/1 -> 获取 ID 为 1 的用户
  3. HTTP 状态码:精准传达结果 (Status Codes)
  4. 过滤、排序、分页与搜索 对于 GET 请求获取资源列表时,复杂的条件应该通过 URL 查询参数(Query Parameters)来传递。
  5. 统一的响应结构 (Response Body)
    1. 版本控制 (Versioning) /api/v1/users