写在开头
本系列内容主要涵盖我在深入学习Java过程中对一些知识点的深入理解和巩固。如果内容表达不准确或存在谬误,欢迎在评论区或私信中进行补充或指正~
目录
在类的方法中使用this关键字时,它具体指代的是什么?作用是什么?
在构造器中使用this关键字,这种用法的主要目的是什么?有哪些规则或限制?
本篇内容旨在重新学习和加深印象关于Java面向对象的内容。为便于记忆,本文内容稍有简化。
Java面向对象
-
作为方法参数,基本数据类型和引用数据类型的区别?
基本数据类型:
按值传递
- 传递的是变量的副本,对该副本的任何修改都不会改变调用方法时传入的变量的值。
public class BasicTypeExample {
public static void modifyValue(int value) {
value = 100; // 修改的是副本,不会影响实际参数
System.out.println("modifyValue Value: " + value); // 输出 100
}
public static void main(String[] args) {
int originalValue = 50;
modifyValue(originalValue); // 调用方法,输出 100
System.out.println("Original Value: " + originalValue); // 输出 50
}
}
引用数据类型:
按引用传递
- 传递的是对象的引用(即地址)。通过这个引用可以操作实际对象,但重新分配引用不会影响外部变量
public class ReferenceTypeExample {
static class MyObject { //自定义一个类
int value; // MyObject的成员变量
}
public static void modifyObject(MyObject obj) { //自定义方法
obj.value = 100; // 修改的是实际对象的属性,会影响到实际参数
}
public static void main(String[] args) {
MyObject originalObject = new MyObject(); //创建MyObject对象originalObject
originalObject.value = 50; //为originalObject的属性赋值50
modifyObject(originalObject); //调用方法,修改value 的值
// 完成修改
System.out.println("Original Object Value: " + originalObject.value); // 输出 100
}
}
补充
引用重新指向
虽然传递的是引用,但如果在方法内部重新分配了引用的地址,这个变化不会反映到调用方法的变量中。
public class ReferenceReassignExample { static class MyObject { //自定义一个类 int value; // MyObject的成员变量 } public static void reassignObject(MyObject obj) { obj = new MyObject(); // 重新分配引用,不会影响实际参数 obj.value = 100; //为obj的属性赋值50 System.out.println("reassignObject Value: " + obj .value); // 输出 100 } //引用指向的地址发生改变,操作的不是同一个对象,所以对外部变量无影响。 public static void main(String[] args) { MyObject originalObject = new MyObject(); //创建MyObject对象originalObject originalObject.value = 50; //为originalObject的属性赋值50 reassignObject(originalObject); //调用方法 System.out.println("Original Object Value: " + originalObject.value); // 输出 50 } }
总结
- 基本数据类型:按值传递,方法内部的修改不会影响到外部变量。
- 引用数据类型:按引用传递,方法内部对对象的修改会影响到外部对象,但重新分配引用不会影响外部变量。
-
可变参数如何使用?
可变参数优势:
- 简化方法调用:避免了需要在调用前创建数组的麻烦。
- 提高代码可变参数与其他参数混用可读性:调用方可以传递任意数量的参数,使代码更简洁。
可变参数与其他参数混用
可变参数与其他参数一起使用,可变参数必须是方法的最后一个参数。
public class VarargsExample {
public static void printDetails(String name, int... scores) { //最后为可变参数
System.out.println("Name: " + name);
System.out.println("Scores: ");
for (int score : scores) {
System.out.print(score + " ");
}
}
public static void main(String[] args) {
printDetails("Alice", 90, 85, 88);
}
}
/*
输出结果:
Name: Alice
Scores:
90 85 88
*/
与数组作为参数的对比
使用可变参数可以使调用代码更简洁,而不需要显示地创建一个数组。
public class VarargsExample {
public static void printNumbers(int... numbers) {
for (int number : numbers) {
System.out.println(number);
}
}
public static void main(String[] args) {
// 使用可变参数,更简洁
printNumbers(1, 2, 3);
// 使用数组
int[] numbersArray = {4, 5, 6};
printNumbers(numbersArray);
}
}
注意事项
- 方法重载:可变参数方法与非可变参数方法在重载时需要注意,可能会导致方法调用的二义性问题。
- 性能:在性能关键的代码中应谨慎使用,因为每次调用都会创建一个数组。
- 多个可变参数:一个方法中只能有一个可变参数,而且必须是方法的最后一个参数。
如何判断是否为方法重载?
方法名:相同;
参数:类型 or 个数不同;
对象的实例化过程?
关于在内存中执行对象的实例化过程,可以分为两部分:
this关键字的相关问题?
-
在类的方法中使用this关键字时,它具体指代的是什么?作用是什么?
this用于引用当前对象的实例。
它主要有两个作用:
- 当成员变量于方法参数名称相同时,使用this可以指明成员变量;
- 在构造器中调用另一个构造器。
-
在构造器中使用this关键字,这种用法的主要目的是什么?有哪些规则或限制?
- 主要目的是重用构造器代码或调用其他构造器来初始化对象。
- 通过this调用构造器时,必须将它放在构造器的第一行,并且只能调用一个构造器。
-
能否在静态方法中使用this关键字?
不能。
因为this关键字指代当前对象的实例,而静态方法是类级别的,没有特定的实例。
-
this关键字如何与方法链式调用相关联?