Overload和Override、super和this、==和equals()的区别

本文详细解释了Java编程语言中的几个核心概念:Overload与Override的区别、super与this的使用场景以及==与equals()方法的不同之处。

Overload和Override、super和this、==和equals()的区别

Overload和Overrride的区别

overload 是方法的重载,函数名一样,可以通过改参数的类型、参数的个数、以及参数的位置实现重载;

注意:不能通过改变返回类型来实现重载

override 是方法的重写,函数名一样,参数的类型、个数、以及参数的位置都必须一致才是重写;

super和this的区别

super.指父类的属性,this.指当前类的属性;
可以通过this.访问父类的属性,受修饰符的限制;

super()指父类的无参构造,this()指当前类的无参构造,两者都放在构造器的第一行,故这两者不能同时出现;

==和equals()的区别

==用来比较内存地址值是否相等,equals()是比较内存地址中的内容是否相等;如下特例:

String st1 = “abc”;
String st2 = “abc”;
Syso(st1==st2);的结果为true
内存判断堆中有一样的值”abc”就不会在栈中重新开辟新的空间,st1和st2就共用一个地址,故可以用==判断是否相等。

<think>我们正在为Java实习生准备面试题及答案。根据引用内容,我们可以从常见的Java面试题中选取适合实习生的问题。实习生面试题通常涵盖基础概念,如面向对象、数据类型、异常处理、集合框架、多线程基础等,避免过于深入的高级主题。 参考引用中提到的内容,我们可以设计如下问题: 1. 面向对象基础:如多态、继承等(参考引用[1]) 2. 内存管理:如垃圾回收(参考引用[3]) 3. 日期操作:如Date类的使用(参考引用[4]) 4. 集合框架 5. 异常处理 6. 基础的多线程概念 注意:由于是实习生级别,问题应侧重基础知识简单应用。 根据以上分析,我们整理20道Java实习生面试题及答案如下: 1. **问题:Java中的多态是什么?如何实现多态?** 答案:多态是指同个行为具有多个不同表现形式或形态的能力。在Java中,多态靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法。实现多态需要个条件:继承、重写向上转型(父类引用指向子类对象)[^1]。 2. **问题:Java的基本数据类型有哪些?** 答案:Java有8种基本数据类型:byte(8位)、short(16位)、int(32位)、long(64位)、float(32位)、double(64位)、char(16位Unicode字符)、boolean(true/false)。 3. **问题:String, StringBuilderStringBuffer的区别?** 答案:String是不可变的,每次操作都会生成新的String对象。StringBuilderStringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的(方法使用synchronized修饰)。在单线程环境下推荐使用StringBuilder,因为它的性能更好。 4. **问题:==equals()区别?** 答案:==用于比较基本数据类型的值是否相等,或者比较两个对象的引用(内存地址)是否相同。equals()是Object类的方法,默认实现也是比较对象引用,但通常会被重写(如String、包装类等)用于比较对象的内容是否相等。 5. **问题:重写(Override重载(Overload)的区别?** 答案:重写发生在父子类中,方法名、参数列表返回类型都相同,重写方法不能比被重写方法有更严格的访问权限。重载发生在同个类中,方法名相同但参数列表不同(类型、个数、顺序),返回类型访问修饰符无关。 6. **问题:final, finally, finalize的区别?** 答案:final是修饰符,可以修饰类(类不能被继承)、方法(方法不能被重写)变量(变量为常量,只能赋值次)。finally是异常处理的部分,用于定义总是执行的代码块,通常用于释放资源。finalize是Object类的方法,在垃圾回收器回收对象之前调用,但般不推荐使用,因为调用时机不确定。 7. **问题:Java中的异常分为哪两大类?有什么区别?** 答案:分为Checked Exception(受检异常)Unchecked Exception(非受检异常)。Checked Exception在编译时检查,必须被捕获或声明抛出,如IOException。Unchecked Exception包括RuntimeException及其子类,通常由程序逻辑错误引起,不强制处理,如NullPointerException。 8. **问题:try-catch-finally中,如果try块catch块中都有return,finally块还会执行吗?** 答案:会执行。finally块中的代码在try或catch块中的return语句执行之前执行。如果finally块中也有return,则会覆盖try或catch块中的返回值。 9. **问题:ArrayListLinkedList的区别?** 答案:ArrayList基于动态数组,支持随机访问(通过索引),但插入删除元素时(尤其是中间位置)效率较低。LinkedList基于双向链表,插入删除元素效率高,但随机访问效率低(需要遍历)。 10. **问题:HashMapHashtable的区别?** 答案:HashMap是非线程安全的,允许null作为键值;Hashtable是线程安全的(方法使用synchronized修饰),不允许null键值。此外,HashMap的迭代器是fail-fast的,而Hashtable的迭代器不是。 11. **问题:什么是垃圾回收?Java中如何判断个对象是否可以被回收?** 答案:垃圾回收是自动内存管理机制,用于回收不再使用的对象占用的内存。判断对象是否可回收的方法有引用计数法(已弃用)可达性分析法。在可达性分析法中,从GC Roots(如虚拟机栈中引用的对象、方法区中静态属性引用的对象、常量引用的对象等)开始搜索,如果对象不可达,则会被标记为可回收[^3]。 12. **问题:Java中如何实现线程?** 答案:有两种方式: 1. 继承Thread类,重写run()方法,然后创建该子类的实例并调用start()方法启动线程。 2. 实现Runnable接口,实现run()方法,然后将该实现类的实例作为参数传递给Thread类的构造器,创建Thread对象并调用start()方法启动。 13. **问题:sleep()wait()区别?** 答案:sleep()是Thread类的静态方法,使当前线程暂停执行指定的时间,不释放锁。wait()是Object类的方法,使当前线程等待,直到其他线程调用该对象的notify()或notifyAll()方法,会释放锁。 14. **问题:synchronized关键字的作用?** 答案:synchronized用于实现线程同步,保证同时刻只有个线程可以执行被同步的代码块或方法。它可以修饰方法(同步方法)或作为代码块的修饰符(同步代码块),需要指定个对象作为锁。 15. **问题:Java中如何获取当前日期?如何将字符串转换为日期?** 答案:可以使用java.util.Date(不推荐)或java.time包中的类(Java 8及以上)。例如,使用LocalDate.now()获取当前日期。将字符串转换为日期可以使用SimpleDateFormat(旧版)或DateTimeFormatter(新版)。 示例(旧版): ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse("2023-01-01"); ``` 示例(新版): ```java DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate date = LocalDate.parse("2023-01-01", formatter); ``` 参考引用[4]中提到了使用毫秒数进行日期操作,但现代Java更推荐使用java.time包。 16. **问题:什么是自动装箱拆箱?** 答案:自动装箱是Java自动将基本数据类型转换为对应的包装类对象,如int转为Integer。自动拆箱是自动将包装类对象转换为对应的基本数据类型,如Integer转为int。 17. **问题:抽象类接口的区别?** 答案:抽象类可以包含抽象方法具体方法,成员变量可以是各种访问类型,可以有构造方法。接口在Java 8之前只能有抽象方法,之后可以有默认方法静态方法,成员变量默认是public static final的,没有构造方法。个类只能继承个抽象类,但可以实现多个接口。 18. **问题:Java中IO流分为哪两类?主要区别是什么?** 答案:分为字节流(InputStream/OutputStream)字符流(Reader/Writer)。字节流以字节(8位)为单位,适合处理进制文件(如图片、视频)。字符流以字符(16位)为单位,适合处理文本文件,因为它们可以处理字符编码问题。 19. **问题:什么是反射?反射有什么用途?** 答案:反射机制允许程序在运行时获取类的信息(如类名、方法、属性等)并操作类或对象。主要用途包括:动态创建对象、调用方法、访问属性,框架设计(如Spring)等。 20. **问题:什么是单例模式?请写个线程安全的单例模式实现。** 答案:单例模式确保个类只有个实例,并提供全局访问点。 线程安全的实现(双重检查锁): ```java public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 以上问题覆盖了Java基础的重要知识点,适合实习生面试。 注意:引用[2]中提到的happens-before原则属于高级多线程内容,实习生般不会涉及,因此我们没有将其放入。 根据要求,我们生成相关问题: §§相关问题§§ 1. 在Java中,如何实现个线程池? 2. Java的集合框架中,List、SetMap有什么区别? 3. 请解释Java中的访问修饰符(public, protected, default, private)? 4. 什么是Java的泛型?它有什么好处? 5. 请解释Java中的static关键字?</think>以下是20道Java实习生面试题及答案,涵盖Java基础、面向对象、集合框架、异常处理多线程等核心知识点: ### 1. Java的大特性是什么? **答案**:封装(隐藏实现细节)、继承(子类复用父类功能)、多态(同接口的不同实现)。多态通过父类引用指向子类对象实现,方法调用在运行时动态绑定[^1]。 ### 2. `==``equals()`的区别? **答案**: - `==`比较基本数据类型的值或对象的**内存地址** - `equals()`默认比较对象地址,但可被重写(如String类重写后比较内容) ```java String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1 == s2); // false(地址不同) System.out.println(s1.equals(s2)); // true(内容相同) ``` ### 3. String、StringBuilder、StringBuffer的区别? **答案**: - `String`:不可变,线程安全但频繁修改效率低 - `StringBuilder`:可变,非线程安全,性能最高 - `StringBuffer`:可变,线程安全(synchronized修饰方法) ### 4. 接口抽象类的区别? **答案**: | **特性** | 抽象类 | 接口 | |----------------|------------------------|------------------------| | 方法实现 | 可有具体方法 | Java 8前只能有抽象方法 | | 变量 | 普通变量 | 默认`public static final` | | 继承 | 单继承 | 多实现 | | 构造方法 | 有 | 无 | ### 5. 异常处理机制中`try-catch-finally`的作用? **答案**: - `try`:包裹可能出错的代码 - `catch`:捕获并处理指定异常 - `finally`:无论是否异常都执行(常用于资源释放) ```java try { FileInputStream fis = new FileInputStream("file.txt"); } catch (FileNotFoundException e) { System.out.println("文件未找到"); } finally { fis.close(); // 确保资源关闭 } ``` ### 6. ArrayListLinkedList的区别? **答案**: - **ArrayList**:基于数组,随机访问快(`O(1)`),插入删除慢(需移动元素) - **LinkedList**:基于双向链表,插入删除快(`O(1)`),随机访问慢(`O(n)`) ### 7. HashMap的工作原理? **答案**: 1. 基于数组+链表/红黑树(JDK8) 2. 通过`key.hashCode()`计算桶位置 3. 哈希冲突时使用链表存储,链表过长(>8)转红黑树 4. 扩容机制:默认负载因子0.75,容量翻倍 ### 8. 线程的创建方式? **答案**: 1. 继承`Thread`类,重写`run()`方法 2. 实现`Runnable`接口(推荐,避免单继承限制) ```java // 方式2示例 Thread thread = new Thread(() -> System.out.println("线程运行")); thread.start(); ``` ### 9. `sleep()``wait()`的区别? **答案**: | **`sleep()`** | **`wait()`** | |------------------------------|------------------------------| | Thread类的方法 | Object类的方法 | | 不释放锁 | 释放锁 | | 需指定睡眠时间 | 可无限等待直到`notify()` | ### 10. 垃圾回收中如何判断对象可回收? **答案**:**可达性分析法**。从GC Roots(如栈局部变量、静态变量)出发,不可达的对象会被标记回收。需满足: 1. 堆中无该类实例 2. 加载该类的ClassLoader已被回收 3. 无任何地方通过反射访问该类[^3] ### 11. 什么是自动装箱拆箱? **答案**: - 装箱:基本类型 → 包装类(`int → Integer`) - 拆箱:包装类 → 基本类型(`Integer → int`) ```java Integer a = 10; // 自动装箱(等价于Integer.valueOf(10)) int b = a; // 自动拆箱(等价于a.intValue()) ``` ### 12. `final`关键字的作用? **答案**: - 修饰变量:常量(不可修改) - 修饰方法:不可被子类重写 - 修饰类:不可被继承(如String类) ### 13. 如何实现日期加减操作? **答案**:使用`java.time`包(JDK8+): ```java LocalDate date = LocalDate.now(); LocalDate newDate = date.plusDays(7); // 加7天 ``` 传统方式需转为毫秒计算(不推荐)[^4]。 ### 14. 泛型中`<? extends T>``<? super T>`的区别? **答案**: - `<? extends T>`:上界通配符(只能读取,不能写入) - `<? super T>`:下界通配符(只能写入,读取需强转) ### 15. 什么是反射?应用场景? **答案**:运行时动态获取类信息并操作对象。应用场景: - 框架(如Spring的IoC) - 动态代理 - IDE的代码提示 ```java Class<?> clazz = Class.forName("com.example.User"); Object obj = clazz.newInstance(); Method method = clazz.getMethod("setName", String.class); method.invoke(obj, "张"); ``` ### 16. `synchronized`的种使用方式? **答案**: 1. 修饰实例方法:锁当前对象 2. 修饰静态方法:锁当前类的Class对象 3. 同步代码块:自定义锁对象 ### 17. Java中深拷贝浅拷贝的区别? **答案**: - **浅拷贝**:复制对象引用(原对象拷贝对象共享内部引用) - **深拷贝**:递归复制所有引用对象(完全独立) 实现深拷贝需重写`clone()`方法或使用序列化。 ### 18. `volatile`关键字的作用? **答案**: 1. 保证变量可见性(直接读写主内存) 2. 禁止指令重排序 注:不保证原子性(如`i++`需配合`synchronized`) ### 19. JDBC操作数据库的步骤? **答案**: 1. 加载驱动:`Class.forName("com.mysql.cj.jdbc.Driver")` 2. 建立连接:`DriverManager.getConnection(url, user, password)` 3. 创建Statement:`conn.createStatement()` 4. 执行SQL:`stmt.executeQuery("SELECT * FROM table")` 5. 处理结果集:`ResultSet`遍历 6. 关闭资源(反向顺序) ### 20. 如何优化Java程序性能? **答案**: - 算法优化(时间复杂度/空间复杂度) - 减少对象创建(重用对象/使用基础类型) - 使用StringBuilder拼接字符串 - 合理选择集合类型(如ArrayList vs LinkedList) - 避免过度同步(缩小同步代码块)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值