语言基础、面向对象、集合框架、IO、泛型、反射、异常处理等等这些都属于Java基础,为了更易于梳理和体系构建,笔者把语言基础和面向对象归类为Java基础,后续知识归为高级特性(基础),整理后后续会发布,希望能与正在准备春招&秋招的伙伴共同交流。如果笔者遇到本章较好的题目,内容会逐步完善更新。
参考 pdai-全栈知识体系
文章目录
一、个人总结
1.1语言基础
1.1.1概述
1.1.2数据类型
- 基本类型:分为四类八种
- 整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
- 浮点型:float(4字节)、double(8字节)
- 字符型:char(2字节,表示单个字符)
- 布尔型:boolean(表示真假值)
- 基本数据类型都有其对应包装类
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。Integer x = 2; // 装箱 int y = x; // 拆箱
- 枚举类型
- 引用类型
- String
- 数组、集合
- 类、接口
1.1.3关键字(final和static的详解)
- final
- final 关键字用于声明一个实体(变量、方法或类)是最终的,不能被修改。
- final变量:一旦给final变量赋值后,就不能更改它的值。final修饰的变量效果上成为常量。例:
final int MAX_VALUE = 10;
- 对于基本类型,final 使数值不变;
- 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
final int x = 1; // x = 2; // cannot assign value to final variable 'x' final A y = new A(); y.a = 1;
- final方法:这种方法不能在子类中重写。
public final void showFinalMethod() { // 方法体 }
- final类:被声明为final的类不能被继承。
例:public final class MyFinalClass { ... }
- 使用final关键字可以让程序运行得更安全,因为它可以避免无意的赋值或继承导致的错误。同时,final 变量经常与不可变类搭配使用,以创建线程安全的常量。
-
static
-
static 关键字用于声明独立于对象的类成员。即它可以创建类级别的变量和方法。
-
静态变量(Static Variable):
- 静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。
- 实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。
public class A { private int x; // 实例变量 private static int y; // 静态变量 public static void main(String[] args) { // int x = A.x; // Non-static field 'x' cannot be referenced from a static context A a = new A(); int x = a.x; int y = A.y; } }
-
静态方法(Static Method):
- 静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法(abstract)。
public abstract class A { public static void func1(){ } // public abstract static void func2(); // Illegal combination of modifiers: 'abstract' and 'static' }
- 只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。
public class A { private static int x; private int y; public static void func1(){ int a = x; // int b = y; // Non-static field 'y' cannot be referenced from a static context // int b = this.y; // 'A.this' cannot be referenced from a static context } }
-
静态语句块
静态语句块在类初始化时运行一次,通常用于初始化变量。public class A { static { System.out.println("123"); } public static void main(String[] args) { A a1 = new A(); A a2 = new A(); } } //123
-
静态内部类(Static Inner Class):它可以访问外部类的静态成员。
- 非静态内部类依赖于外部类的实例,而静态内部类不需要。
public class OuterClass { class InnerClass { } static class StaticInnerClass { } public static void main(String[] args) { // InnerClass innerClass = new InnerClass(); // 'OuterClass.this' cannot be referenced from a static context OuterClass outerClass = new OuterClass(); InnerClass innerClass = outerClass.new InnerClass(); StaticInnerClass staticInnerClass = new StaticInnerClass(); } }
-
静态导入(Static Import):允许导入类的静态成员而无需类前缀。
- 在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
例:import static java.lang.Math.*;
- 在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
-
初始化顺序:
- 静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
public static String staticField = "静态变量";
static { System.out.println("静态语句块"); }
public String field = "实例变量";
{ System.out.println("普通语句块"); }
public InitialOrderTest() { System.out.println("构造函数"); }
-
存在继承的情况下,初始化顺序为:
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)
-
静态成员是类的一部分,而不是单个实例的一部分。这意味着如果一个对象修改了一个静态变量,这个修改会影响到所有的实例。
-
两者(static 和 final)也经常一起使用,例如在定义静态常量的时候,static final 一起使用能够创建全局常量。
1.1.4变量声明与初始化
- 变量声明:指定变量类型并赋予名字
- 示例:
int number;
- 示例:
- 变量初始化:为变量赋予初始值
- 示例:
number = 10;
- 示例:
- 常量声明:使用final关键字定义常量,常量一旦赋值不能改变
- 示例:
final double PI = 3.14;
- 示例:
1.1.5运算符
- 算术运算符:
+
、-
、*
、/
、%
(取模)、++
(自增)、--
(自减) - 比较运算符:
==
、!=
、>
、<
、>=
、<=
- 逻辑运算符:
&&
(与)、||
(或)、!
(非) - 赋值运算符:
=
、+=
、-=
、*=
、/=
、%=
等 - 位运算符:
&
(和)、|
(或)、^
(异或)、~
(取反)、<<
(左移)、>>
(右移)
1.1.6控制流语句
- 条件语句:
- if、else if、else:根据条件执行不同代码块
- switch:根据不同的case值执行不同代码块
//java7开始switch支持String对象 //switch不支持long String s = "a"; switch (s) { case "a": System.out.println("aaa"); break; case "b": System.out.println("bbb"); break; }
- 循环语句:
for:一种有限次循环,通常知道循环次数时使用
while:当某条件为真,执行循环体
do-while:先执行循环体至少一次,然后检查条件 - 控制转移语句:
break:退出循环或switch语句
continue:跳过当前循环的剩余部分执行下一次循环
return:退出当前方法
1.1.7类型转换
- 隐式类型转换:小类型自动转换到大类型,如int自动转换成double
- 显式类型转换(强制类型转换):需要显示声明新类型,可能造成数据丢失
- 示例:
int a = (int) 3.14;
- 示例:
1.1.8字符串处理
public class StringExample {
public static void main(String[] args) {
// 创建字符串
String greeting = "Hello";
// 字符串连接
String name = "World";
String message = greeting + ", " + name + "!";
System.out.println(message);
// 计算字符串长度
int length = message.length();
System.out.println("Length of the message: " + length);
// 截取字符串
String sub = message.substring(0, 5); // 截取Hello
System.out.println("Substring: " + sub);
// 转换大小写
String upperMessage = message.toUpperCase();
String lowerMessage = message.toLowerCase();
System.out.println("Uppercase: " + upperMessage);
System.out.println("Lowercase: " + lowerMessage);
// 比较字符串
String anotherGreeting = "HELLO";
System.out.println("Are greetings equal? " + greeting.equalsIgnoreCase(anotherGreeting));
// 检查字符串是否包含另一个字符串
System.out.println("Does message contain name? " + message.contains(name));
// 替换字符串中的字符
String replacedMessage = message.replace("l", "r");
System.out.println("Replaced message: " + replacedMessage);
// 去掉字符串首尾空格
String spacedString = " lots of space ";
System.out.println("Trimmed string: '" + spacedString.trim() + "'");
// 字符串分割
String[] words = message.split(" ");
System.out.println("The message split into words:");
for (String word : words) {
System.out.println(word);
}
// 检查字符串开头和结尾的字符或子字符串
System.out.println("Does the message start with 'Hello'? " + message.startsWith("Hello"));
System.out.println("Does the message end with 'world!'? " + message.endsWith("world!"));
// 获取指定位置的字符
char specificChar = message.charAt(1);
System.out.println("The character at index 1 is: " + specificChar);
// 字符串格式化
String formatted = String.format("This is a %s formatted by %s", "string", "String.format");
System.out.println(formatted);
}
}
String、StringBuilder、StringBuffer:
- 可变性
- String 不可变
- StringBuffer 和 StringBuilder 可变
- 线程安全
- String 不可变,因此是线程安全的
- StringBuilder 不是线程安全的
- StringBuffer 是线程安全的,内部使用 synchronized 进行同步
1.1.9数组
import java.util.Arrays;
public class ArrayOperations {
public static void main(String[] args) {
// 创建并初始化数组
int[] numbers = {
3, 5, 1, 4, 2};
// 打印原始数组
System.out.println("Original array: " + Arrays.toString(numbers));
// 排序数组
Arrays.sort(numbers);
System.out.println(