Skip to content

Java基础语法

数据类型

基本数据类型有哪些?

答案: Java有8种基本数据类型:

  • 整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
  • 浮点型:float(4字节)、double(8字节)
  • 字符型:char(2字节)
  • 布尔型:boolean(1字节)

int和Integer的区别?

答案:

  1. 类型不同:int是基本数据类型,Integer是包装类
  2. 默认值:int默认值为0,Integer默认值为null
  3. 存储位置:int存储在栈中,Integer对象存储在堆中
  4. 性能:int性能更高,Integer需要装箱拆箱
  5. 泛型支持:泛型不支持基本类型,只能用Integer
java
// 自动装箱
Integer i = 100; // 等价于 Integer.valueOf(100)

// 自动拆箱
int j = i; // 等价于 i.intValue()

// 缓存机制:-128到127之间的Integer对象会被缓存
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true

Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false

String相关

String、StringBuilder、StringBuffer的区别?

答案:

特性StringStringBuilderStringBuffer
可变性不可变可变可变
线程安全安全不安全安全(synchronized)
性能最低最高中等
使用场景少量字符串操作单线程大量操作多线程大量操作
java
// String不可变,每次拼接都会创建新对象
String s = "hello";
s += " world"; // 创建了新的String对象

// StringBuilder可变,适合单线程
StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 在原对象上修改

// StringBuffer线程安全
StringBuffer sbf = new StringBuffer("hello");
sbf.append(" world"); // 方法加了synchronized

String为什么设计成不可变?

答案:

  1. 安全性:String常用作HashMap的key,不可变保证hash值不变
  2. 线程安全:不可变对象天然线程安全,无需同步
  3. 字符串常量池:可以复用相同内容的字符串,节省内存
  4. 安全:防止被恶意修改(如文件路径、网络连接等)

关键字

final、finally、finalize的区别?

答案:

  • final:修饰符

    • 修饰类:不能被继承
    • 修饰方法:不能被重写
    • 修饰变量:常量,只能赋值一次
  • finally:异常处理关键字,无论是否发生异常都会执行

  • finalize:Object类的方法,GC回收对象前调用(已废弃)

java
// final示例
final class FinalClass {} // 不能被继承

class Parent {
    final void method() {} // 不能被重写
}

final int MAX = 100; // 常量

// finally示例
try {
    // 可能抛异常的代码
} catch (Exception e) {
    // 异常处理
} finally {
    // 一定会执行(除非JVM退出)
}

static关键字的作用?

答案:

  1. 静态变量:类变量,所有实例共享
  2. 静态方法:不依赖实例,通过类名调用
  3. 静态代码块:类加载时执行一次
  4. 静态内部类:不依赖外部类实例
java
public class StaticDemo {
    static int count = 0; // 静态变量

    static { // 静态代码块
        System.out.println("类加载时执行");
    }

    static void method() { // 静态方法
        System.out.println("静态方法");
    }

    static class Inner { // 静态内部类
    }
}

面向对象

重载(Overload)和重写(Override)的区别?

答案:

特性重载重写
定义同一类中方法名相同,参数不同子类重新定义父类方法
参数列表必须不同必须相同
返回类型可以不同相同或子类型
访问修饰符可以不同不能更严格
异常可以不同不能抛出新的或更广的异常
java
// 重载
class Calculator {
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }
    int add(int a, int b, int c) { return a + b + c; }
}

// 重写
class Animal {
    void sound() { System.out.println("动物叫"); }
}

class Dog extends Animal {
    @Override
    void sound() { System.out.println("汪汪"); }
}

接口和抽象类的区别?

答案:

特性接口抽象类
继承可以实现多个接口只能继承一个抽象类
方法默认public abstract可以有具体实现
变量默认public static final可以有实例变量
构造方法不能有可以有
设计理念定义行为规范代码复用
java
// 接口
interface Flyable {
    void fly(); // 默认public abstract
}

// 抽象类
abstract class Animal {
    String name; // 实例变量

    abstract void sound(); // 抽象方法

    void sleep() { // 具体方法
        System.out.println("睡觉");
    }
}

练习题

  1. 为什么String的hashCode()方法要使用31作为乘数?
  2. 解释Java的值传递机制
  3. ==和equals()的区别?
  4. Java中如何实现深拷贝和浅拷贝?

Released under the MIT License.