关于Java的方法
“方法”的意思是
在中文中,这个句子的翻译如下:
类是一组操作(功能、可以执行的操作、命令等)的集合。具体描述来说,它是属于特定类或对象的一组处理任务和重复任务的集合,将多个操作组合成一个方法。
戻り値の型 メソッド名 (引数){
処理(命令文)
return;(戻り値)
}
・参数:从调用者那里接收的值。当想要用这个值来处理数据时,指的是传递的值。即使没有参数,也要写上()。
・返回值:在方法处理后返回给调用者的值。简单说就是处理结果的数据。使用“return”指定。如果没有返回值(不返回任何东西),要在返回值的类型上写上“void”。
・方法名:可以随意取名,遵循变量的命名规则。
void メソッド名(引数){
処理(命令文)
}
class Student{
//メンバ変数(属性)
String name;
int engScore;
int mathScore;
//メソッド(操作)
void display(){
System.out.println(name + "さん");
System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
}
void setScore(int eng, int math){
engScore = eng;
mathScore = math;
}
double getAvg(){
double avg = (engScore + mathScore) / 2.0;
return avg;
}
}
在方法中定义的变量被称为局部变量。局部变量的作用域仅限于方法内部,所以无法从其他方法访问另一个方法的局部变量,并且当方法结束时,局部变量也会被销毁。
上面的图片展示了方法的三种情况:
1. 没有返回值和参数的情况;
2. 有参数但没有返回值的情况;
3. 有返回值但没有参数的情况。
没有参数和返回值的方法
class Point {
int x;
int y;
//呼び出される側
void printPonition() {
System.out.println("座標値は(" + this.x +","+ this.y +")です");
}
void printPonition2() {
System.out.println("座標値は(" + this.x +","+ this.y +")です");
}
}
class Main {
public static void main(String[] args) {
Point p1 = new Point();
p1.x = 10;
p1.y = 5;
Point p2 = new Point();
p2.x = 5;
p2.y = 2;
System.out.println("p1.printPonitionメソッドの呼び出し");
//p1のprintPonitionメソッドを呼び出し
p1.printPonition();
System.out.println("--------");
System.out.println("p2.printPonitionメソッドの呼び出し");
p2.printPonition();
}
}
p1.printPonition1メソッドの呼び出し
座標値は(10,5)です
--------
p2.printPonition2メソッドの呼び出し
座標値は(5,2)です
在实例上面,可以通过在变量名后加上点(.)并写入方法名的方式来执行方法。
“this” 是一个表示自身的关键词。它用于在方法中引用实例变量。
执行开始于main方法中的代码,从Main类开始而不是Java的执行。按顺序从上至下执行,并在调用printPosition1方法时,处理流程将转移到printPosition1方法中所写的指令。当执行完printPosition1方法中的指令时,流程将返回到调用方并输出”——“,然后调用printPosition2方法。这样,处理流程一直连续不断地执行每个指令。
有参数的方法(无返回值)
传递参数可以使用方法名后面的括号()进行。接收作为参数传递给方法的值(实际参数)的变量(形式参数)只能在该方法中使用,它成为局部变量。如果要指定多个参数,可以在括号中用逗号(,)分隔类型和变量名的组合来描述。调用方法的一方同样地,在括号中用逗号(,)分隔值来描述。
void メソッド名(型 変数(仮引数));
class Pont {
int x;
int y;
void printPonition() {
System.out.println("座標値は(" + this.x +","+ this.y +")です");
}
void add(int n, int m ) { //仮引数としてint nと int mを受けとっている
this.x += n;
this.y += m;
}
}
class ArgumentsExample {
public static void main(String[] args) {
Pont p = new Pont();
p.x = 10;
p.y = 5;
p.printPonition();
p.add(3,4); //addメソッドに実数として整数の3と4を渡している。
p.printPonition();
}
}
座標値は(10,5)です ←最初にxとyの値を10と5に設定
座標値は(13,9)です ←addメソッドに整数3と4を渡しているのでxとyにそれぞれが足された結果になる
使用 add 方法时传入整数 3 和 4 作为实数,并接受 int n 和 int m 作为形式参数。将 3 赋值给 int n,将 4 赋值给 int m,然后编写 this.x += n; this.y += m;,以便输出两者相加的结果。
只需要一种选项:
* 参数需根据传递的值的数量进行编写,并且必须使用与传递的值相同的数据类型进行声明。
有返回值的方法(无参数)
在调用方不仅可以将值传递给方法,还可以在调用方接收方法处理后的结果值。
通过接收返回值,调用方可以了解某个计算的结果或者处理是否成功。
一个方法只能指定一个返回值,并且需要在方法名之前注明返回值的类型。
如果返回值是基本类型,需要注明int、double、boolean等类型的名称;如果返回值是引用类型,则需要注明类名,如Point。
在方法处理的最后,紧跟着关键字return,并且写下要返回的值。需要注意的是,返回的数据类型必须与返回值的数据类型完全一致,否则在编译时会出现错误。
戻り値の型 メソッド名 (引数){
処理(命令文)
return 戻り値;
}
class Point {
int x;
int y;
//xとyを掛けた結果を返す
int getXY() {
return this.x * this.y;
}
}
class Main {
public static void main(String[] args) {
Point p = new Point();
p.x = 10;
p.y = 5;
//pのgetXYメソッドの戻り値をint型の変数xyに代入
int xy = p.getXY();
System.out.println("pのxとyを掛けた結果は" + xy);
}
}
pのxとyを掛けた結果は50
有参数和返回值的方法
在之前我们分别看过有参数的方法和有返回值的方法,但也可以存在既有参数又有返回值的方法。
下列的isSamePosition方法接收Point类实例的引用作为参数,并比较该实例与自己的坐标值,返回比较结果。返回值为布尔类型,如果坐标值相同,则返回true,否则返回false。
像这样的方法不仅可以接收基本类型(如int或double)的值,还可以接收实例的引用作为参数。
class Point {
int x;
int y;
void muitiply(int n) {
this.x *= n;
this.y *= n;
}
boolean isSamePosition(Point p) {
if(this.x == p.x && this.y == p.y) {
return true;
} else {
return false;
}
}
}
class Main {
public static void main(String[] args) {
Point p1 = new Point();
p1.x = 4;
p1.y = 2;
Point p2 = new Point();
p2.x = 8;
p2.y = 4;
if(p1.isSamePosition(p2) == true) {
System.out.println("p1とp2は同じ座標です" );
} else {
System.out.println("p1とp2は異なる座標です");
}
p1.muitiply(2);
if(p1.isSamePosition(p2) == true) {
System.out.println("p1とp2は同じ座標です");
} else {
System.out.println("p1とp2は異なる座標です");
}
}
}
p1とp2は異なる座標です
p1とp2は同じ座標です
isSamePosition方法接收的参数是Point类的实例,所以可以将变量 p2 作为参数传入。(虽然表达为“Point类的实例”,但实际上isSamePosition方法接收的是“Point类实例的引用”)。通过比较程序代码和结果,最开始时,p1的坐标是(2,4),p2的坐标是(4,8),结果不同。但是在中间,p1的坐标变成了(4,8),可以确认p1和p2现在具有相同的坐标。
类方法(静态方法)和实例方法
静态方法是带有静态修饰符的方法。
实例方法是不带有静态修饰符的方法,正如其名称所示,它是与实例相关联的方法,因此必须通过实例化类来使用。
在Java中,通常的方法需要实例化类后才能使用,但加上static修饰符的类方法可以直接调用和使用,它是与类相关联的方法,并定义了与整个类相关的处理。
クラス名.メソッド名();
//例文
Student4 stu1 = new Student4("菅原");
Student4.display();
インスタンス名.メソッド名();
//例文
Student4 stu1 = new Student4("菅原");
stu1.display();
静态方法(类方法)和实例方法的使用方式
静态方法(类方法)的主要用途是执行不依赖于实例状态的操作。这也被称为实用方法,并用于规定好的处理操作。
当需要在每个实例(对象)上执行不同操作时,我们使用实例方法,因为实例方法是绑定在实例(对象)上的方法。
例如,以标准API中的String类为例(类库是指将类进行组织的类库,其中包含的类根据功能和目的被存储为包),用于比较值的“equals”方法是实例方法,将int类型的变量转换为String类型的“valueOf”是静态方法。
public boolean equals(Object anObject) ← インスタンスメソッド
public static String valueOf(int i) ← staticメソッド
“equals”方法是一个实例方法,用于比较字符串对象(实例)是否相等,并且依赖于字符串对象(实例)的状态。
//equalsメソッドは2つの文字列が等しいかどうかの比較をする
String value = "あああ";
value.equals("いいい"); ← Stringのオブジェクト「value」に依存している
与此相对应的是,作为静态方法的”valueOf”方法是一种将int类型变量转换为String类型变量的方法,并且不依赖于String对象(实例)的状态。
// valueOfメソッドは引数に指定した様々な型の形をString型の文字列として返すことができる
String newValue = String.valueOf(123); ← Stringのオブジェクトに関係ない処理
// String.valueOfでint型の変数(123)をStringm型のオブジェクトnewValueに変換している
如此说来,静态方法可以执行与实例状态无关的操作。
下面是一个例句的中文本地语言释义:
“The weather is very hot today, so I’m going to the beach to swim and cool off.”
public class UtilitySampleMain {
public static void main(String[] args) {
System.out.println("数値チェックの結果:" + UtilitySample.isNumber("あいうえお"));
}
}
import java.util.regex.Pattern;
public class UtilitySample {
private UtilitySample() {}
/**
* @param value 検証対象の値
* @return 結果(true:数値、false:数値ではない)
*/
// 数値チェックをする為のインスタンスの状態に依存しないisNumberメソッド
public static boolean isNumber(String value) {
boolean result = false;
if (value != null) {
Pattern pattern = Pattern.compile("^[0-9]+$|-[0-9]+$");
result = pattern.matcher(value).matches();
}
return result;
}
}
数値チェックの結果:false
「isNumber」方法使用正则表达式来判断参数的值是否为数值。(使用标准API的Pattern类)
由于「UtilitySample」类只实现了静态方法,因此将构造函数设为私有,以防止从外部生成对象(实例)。
通过将构造函数设为私有,明确了它是一个实用工具类。
参考资料