关于Java的方法

“方法”的意思是

在中文中,这个句子的翻译如下:

类是一组操作(功能、可以执行的操作、命令等)的集合。具体描述来说,它是属于特定类或对象的一组处理任务和重复任务的集合,将多个操作组合成一个方法。

戻り値の型 メソッド名 (引数){
     処理(命令文)
     return;(戻り値)
  }

・参数:从调用者那里接收的值。当想要用这个值来处理数据时,指的是传递的值。即使没有参数,也要写上()。
・返回值:在方法处理后返回给调用者的值。简单说就是处理结果的数据。使用“return”指定。如果没有返回值(不返回任何东西),要在返回值的类型上写上“void”。
・方法名:可以随意取名,遵循变量的命名规则。

void メソッド名(引数){
    処理(命令文)
}
スクリーンショット 2022-11-02 13.32.32.png
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」类只实现了静态方法,因此将构造函数设为私有,以防止从外部生成对象(实例)。

通过将构造函数设为私有,明确了它是一个实用工具类。

参考资料

 

广告
将在 10 秒后关闭
bannerAds