1. 试题一:基本数据类型与引用数据类型的区别
1.1 试题描述
在Java中,基本数据类型(如int、float、double等)和引用数据类型(如String、自定义类等)在值传递上有何区别?
1.2 解析
- 基本数据类型:在方法调用时,会将实际参数的值复制一份传递给方法内部的局部变量,因此方法内部对局部变量的修改不会影响实际参数的值。
- 引用数据类型:在方法调用时,传递的是对象的引用(即内存地址),因此方法内部对对象的修改会影响到实际参数所指向的对象。
1.3 示例代码
public class Main {
public static void main(String[] args) {
int a = 10;
System.out.println("修改前a的值:" + a);
changeValue(a);
System.out.println("修改后a的值:" + a);
StringBuilder sb = new StringBuilder("Hello");
System.out.println("修改前sb的值:" + sb);
changeValue(sb);
System.out.println("修改后sb的值:" + sb);
}
public static void changeValue(int a) {
a = 20;
}
public static void changeValue(StringBuilder sb) {
sb.append(" World");
}
}
2. 试题二:String是不可变的
2.1 试题描述
为什么说String是不可变的?
2.2 解析
- 不可变性:String类在Java中是不可变的,意味着一旦创建了一个String对象,就不能修改其内容。
- 原因:String内部使用的是char数组存储字符,如果允许修改,则需要修改数组的元素,这将导致原有的String对象发生变化,违反了不可变性的原则。
2.3 示例代码
public class Main {
public static void main(String[] args) {
String str = "Hello";
System.out.println("修改前str的值:" + str);
str = str + " World";
System.out.println("修改后str的值:" + str);
}
}
3. 试题三:StringBuffer和StringBuilder的区别
3.1 试题描述
StringBuffer和StringBuilder的区别是什么?
3.2 解析
- StringBuffer:线程安全,适用于多线程环境。
- StringBuilder:非线程安全,适用于单线程环境,性能优于StringBuffer。
3.3 示例代码
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" World");
System.out.println(sb.toString());
StringBuffer sbf = new StringBuffer();
sbf.append("Hello");
sbf.append(" World");
System.out.println(sbf.toString());
}
}
4. 试题四:包装类与原始数据类型的区别
4.1 试题描述
Java中的包装类与原始数据类型有何区别?
4.2 解析
- 包装类:如Integer、Double等,是Java中对应原始数据类型的类。
- 原始数据类型:如int、float、double等,是基本数据类型。
4.3 示例代码
public class Main {
public static void main(String[] args) {
Integer i = 10;
int j = 10;
System.out.println(i == j); // false
System.out.println(i.equals(j)); // true
}
}
5. 试题五:重载与重写的区别
5.1 试题描述
Java中的重载与重写有何区别?
5.2 解析
- 重载:在同一个类中,方法名相同,但参数列表不同的方法。
- 重写:在子类中,方法名、参数列表和返回类型都与父类中的方法相同。
5.3 示例代码
public class Main {
public static void main(String[] args) {
Parent parent = new Child();
parent.show(10); // 输出:Child
}
}
class Parent {
public void show(int a) {
System.out.println("Parent");
}
}
class Child extends Parent {
@Override
public void show(int a) {
System.out.println("Child");
}
}
6. 试题六:final关键字的作用
6.1 试题描述
final关键字在Java中有何作用?
6.2 解析
- 变量:声明为final的变量只能被赋值一次。
- 方法:声明为final的方法不能被子类重写。
- 类:声明为final的类不能被继承。
6.3 示例代码
public class Main {
public static void main(String[] args) {
final int a = 10;
// a = 20; // 编译错误,final变量只能赋值一次
class Parent {
public final void show() {
System.out.println("Parent");
}
}
class Child extends Parent {
// @Override
// public void show() {
// System.out.println("Child");
// } // 编译错误,final方法不能被重写
}
final class FinalClass {
// ...
}
}
}
7. 试题七:this关键字的作用
7.1 试题描述
this关键字在Java中有何作用?
7.2 解析
- 指向当前对象:在方法内部,this关键字指向当前对象。
- 区分变量和方法:当方法名与变量名相同时,使用this关键字可以区分当前对象的方法和变量。
7.3 示例代码
public class Main {
public static void main(String[] args) {
Person person = new Person("张三");
person.show();
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void show() {
System.out.println(this.name);
}
}
8. 试题八:Java中的继承与组合
8.1 试题描述
Java中的继承与组合有何区别?
8.2 解析
- 继承:子类继承父类,可以继承父类的属性和方法。
- 组合:一个类包含另一个类的对象,可以复用其他类的功能。
8.3 示例代码
public class Main {
public static void main(String[] args) {
Car car = new Car(new Engine());
car.start();
}
}
class Engine {
public void start() {
System.out.println("Engine started");
}
}
class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.start();
}
}
通过以上8大经典试题的深度解析,相信你已经对Java值传递有了更深入的了解。希望这些知识能帮助你更好地掌握Java编程!
