介绍
在本实验中,我们将继续学习方法和对象。任务是学习如何定义带参数的方法。对象是面向对象编程(OOP)语言中非常重要的概念,因此对其有深入的理解对你将大有裨益。
在本实验中,我们将继续学习方法和对象。任务是学习如何定义带参数的方法。对象是面向对象编程(OOP)语言中非常重要的概念,因此对其有深入的理解对你将大有裨益。
在某些情况下,你需要一些可以重复使用的代码来解决一些类似的问题,例如打印某人的年龄和姓名。对于不同的人,姓名和年龄是不同的。这两个变量可以作为参数传递给代码块。这里我们引入了方法的概念,方法将执行任务。
示例:
在 /home/labex/project/methodTest.java
文件中编写以下代码:
public class methodTest
{
public static void main(String[] args)
{
// 调用我们自定义的方法
printInfo("Mike", 18);
// 调用我们自定义的方法
System.out.println(fibonacci(10));
System.out.println(fibonacciNormal(10));
}
// 我们定义一个类方法来打印个人信息
public static void printInfo(String name, int age){
System.out.println("Hello " + name + ", your age is " + age);
}
// 定义一个类方法,通过递归计算斐波那契数列
public static int fibonacci(int n){
if(n<=2){
return 1;
}else{
return fibonacci(n-1)+fibonacci(n-2);
}
}
// 定义一个类方法,通过迭代循环计算斐波那契数列
public static int fibonacciNormal(int n){
if(n<=2){
return 1;
}
int n1=1,n2=1,sum=0;
for(int i=0;i<n-2;i++){
sum=n1+n2;
n1=n2;
n2=sum;
}
return sum;
}
}
输出:
使用以下命令运行 methodTest.java
文件:
javac /home/labex/project/methodTest.java
java methodTest
查看输出:
Hello Mike, your age is 18
55
55
在上面的示例中,我们编写了一个名为 printInfo
的函数。你可以随意命名它。它有两个参数,返回类型为 void
,意味着不会返回任何值。你可以根据需要确定函数的返回类型,参数的数量和类型也可以是任意的。你可以按以下方式定义你的方法:
示例:
public/private static/final/{非必需} 返回类型 方法名( 参数列表 ) {
// 语句
}
public String getName(){}
public void setName(){}
public static void newInstance(){}
public final String msg(){}
Java 提供了许多内置库方法,用于执行最常见的操作,例如数学函数。这些函数被称为方法。方法的调用语法类似于我们已经见过的打印语句:
示例:
double root = Math.sqrt(16.0); // root = 4.0
double height = Math.sin(1.5); // height = 0.9974949866040544
在 Java 中,有两种类型:基本类型(primitive types)和对象类型(object types)。基本类型,如 int
和 boolean
,以小写字母开头;对象类型以大写字母开头。这种区分很有用,因为它提醒我们它们之间的一些区别:
当你声明一个基本类型变量时,你会为该基本类型的值分配存储空间。当你声明一个对象类型变量时,你会为该对象的引用分配空间。要为对象本身分配空间,你必须使用
new
操作符。
如果你没有初始化一个基本类型变量,它会根据其类型获得一个默认值。例如,
int
的默认值是0
,boolean
的默认值是false
。对象类型的默认值是null
,表示引用变量没有引用任何对象。
基本类型变量在某种程度上是隔离的,因为你无法在一个方法中做任何事情来影响另一个方法中的变量。对象类型变量可能会比较棘手,因为它们不像基本类型那样隔离。如果你将一个对象的引用作为参数传递,你调用的方法可能会修改该对象,在这种情况下你会看到效果。当然,这可能是件好事,但你必须意识到这一点。
如果我们将基本类型变量传递给一个方法(按值传递参数),我们实际上是复制基本类型的值并在方法内部使用这些副本。方法内部的所有操作都作用于这些副本;而在方法外部,基本类型变量的值不受影响。但是,如果我们将非基本类型的对象传递给一个方法(按引用传递参数),我们传递的是引用变量。所有操作实际上都会使用和/或影响原始对象。
示例:
在 /home/labex/project/objectTest.java
文件中编写以下代码:
public class objectTest {
public static void main(String[] args){
// 使用 new 创建一个包含两个元素的数组对象
int[] numbers = new int[2];
// 为数组对象赋值
numbers[0] = 1;
numbers[1] = 2;
// 以这种方式创建基本类型变量
int a = 1 , b = 2;
// 创建一个测试对象
objectTest test = new objectTest();
test.changeInt(a, b);
System.out.println("Now a is " + a + ", b is " + b);
test.changeArray(numbers);
System.out.println("Now numbers contain:");
for(int i : numbers){
System.out.print(i + "\t");
}
}
// 定义一个对象方法,修改 int 值
public void changeInt(int a,int b){
a = 2;
b = 3;
System.out.println("In changeInt method, a is " + a + ", b is " + b);
}
// 定义一个对象方法,修改数组值
public void changeArray(int[] number){
for(int i = 0;i < number.length;i++){
number[i] = number[i]+1; // 将数组元素的值增加 1
}
System.out.println("In changeArray method, numbers contain:");
for(int i : number){
System.out.print(i + "\t");
}
System.out.println();
}
}
输出:
在终端中使用以下命令运行 objectTest.java
文件:
javac /home/labex/project/objectTest.java
java objectTest
查看输出:
In changeInt method, a is 2, b is 3
Now a is 1, b is 2
In changeArray method, numbers contain:
2 3
Now numbers contain:
2 3
基本类型和对象类型之间还有一个区别。你无法向 Java 中添加新的基本类型(除非你加入标准委员会),但你可以创建新的对象类型!我们将在下一章中看到如何做到这一点。
方法是类中常见的组成部分。方法是一个执行特定操作的代码块。Java 提供了许多内置类,我们可以直接使用它们。向方法传递参数有两种方式:按值传递和按引用传递。它们的效果是不同的。在下一个实验中,我们将向你介绍这些内容。希望这对你有所帮助。