java面试-基础语法与面向对象

简介: 本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。

1.1 重载与重写的区别

  • 重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
  • 重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
  • 重载在编译阶段,由编译器根据传递给方法的参数来区分方法,例如
    MyObject obj = ...
    obj.test(123);   // 应该是调用 test(int x) 这个方法
    obj.test("abc"); // 应该是调用 test(String x) 这个方法
    
  • 而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法,例如
    Super obj = ...
    obj.test();     // 到底是调用父类,还是子类的 test 方法,必须检查引用对象的实际类型才能确定
    
  • 有没有发生重写,可以使用 @Override 来检查
    重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符
    重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常
    重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类
    

    1.2 == 与 equals 的区别

  • 对于基本类型,== 是比较两边的值是否相同
  • 对于引用类型,== 是比较两边的引用地址是否相同,用来判断是否引用着同一对象
  • equals 要看实现
    • Object.equals(Object other) 的内部实现就是 ==,即判断当前对象和 other 是否引用着同一对象
    • 比如 String,它的内部实现就是去比较两个字符串中每个字符是否相同,比较的是内容
    • 比如 ArrayList,它的内部实现就是去比较两个集合中每个元素是否 equals,比较的也是内容
      // Java 示例
      String a = new String("text");
      String b = new String("text");
      System.out.println(a == b);       // false(地址不同)
      System.out.println(a.equals(b));  // true(内容相同)
      
      image.png

      1.3 String,StringBuilder 和 StringBuffer 的区别

  • 它们都可以用来表示字符串对象
  • String 表示的字符串是不可变的,而后两者表示的字符串是内容可变的(可以增、删、改字符串里的内容)
    image.png
// 示例:String 的不可变性
String s1 = "hello";
s1 += " world";  // 创建新对象 "hello world",原对象 "hello" 仍在内存中

// 示例:StringBuilder 的修改
StringBuilder sb = new StringBuilder("hello");
sb.append(" world");  // 直接修改为 "hello world",无新对象生成
  • StringBuilder 不是线程安全的,StringBuffer 是线程安全的,而 String 也算是线程安全的
    image.png
// 示例:StringBuffer 的同步方法
StringBuffer buffer = new StringBuffer();
buffer.append("A");  // 内部加锁,保证多线程安全

image.png

// 性能测试示例(单线程)
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
   
    sb.append(i);  // 耗时约 5ms
}

StringBuffer sbf = new StringBuffer();
for (int i = 0; i < 100000; i++) {
   
    sbf.append(i);  // 耗时约 15ms(同步开销)
}

适用场景

  • 大部分场景下使用 String 就足够了
  • 如果有大量字符串拼接的需求,建议用后两者,此时
    • 此字符串对象需要被多线程同时访问,用 StringBuffer 保证安全
    • 此字符串对象只在线程内被使用,用 StringBuilder 足够了
      另外针对 String 类是 final 修饰会提一些问题,把握下面几点
  • 本质是因为 String 要设计成不可变的,final 只是条件之一
  • 不可变的好处有很多:线程安全、可以缓存等

    4.Java 中的异常

    image.png
    image.png
    image.png
    image.png
// 自定义 Checked 异常
class PaymentFailedException extends Exception {
   
    public PaymentFailedException(String message) {
   
        super(message);
    }
}
// 自定义 Unchecked 异常
class InvalidInputException extends RuntimeException {
   
    public InvalidInputException(String field) {
   
        super("字段 " + field + " 值非法");
    }
}

image.png

  • 常见的非检查异常有
    • 空指针异常
    • 算术异常(例如整数除零)
    • 数组索引越界异常
    • 类型转换异常
相关文章
|
4月前
|
存储 Java 容器
Java基本语法详解
本文深入讲解了Java编程的基础语法,涵盖数据类型、运算符、控制结构及数组等核心内容,帮助初学者构建坚实的编程基础。
|
3月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
3月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
314 1
Redis-常用语法以及java互联实践案例
|
3月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
163 1
|
3月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
148 0
|
3月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
4月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
246 0
|
4月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
5月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
101 0