前言:方法让我们写代码提供了更加便捷,一个方法可以多次复用,也提高了代码的可维护性。
先给大家举个例子,在此之前,大家肯定都以熟悉Systm.out.println()了吧。
这里面的System是一个类,out是System下的一个输出对象,println()是方法。
public static void main(String[] args),这个也是大家熟悉的main方法。
下面让我们来学习方法吧。
一、方法的定义
方法是一个可重用的代码块,通常用于执行某种操作。它可以接受参数并返回值。方法的基本语法如下:
访问权限符 返回值 方法名(参数列表){
方法体
}
访问权限符:
1、 public
(1)定义:public是公共的,被public所修饰的成员可以在任何类中都能被访问到。
(2)作用域:public能用来修饰类,在一个java源文件中只能有一个类被声明为public,而且一旦有一个类为public,那这个java源文件的文件名就必须要和这个被public所修饰的类的类名相同,否则编译不能通过。public用来修饰类中成员(变量和方法),被public所修饰的成员可以在任何类中都能被访问到。通过操作该类的对象能随意访问public成员。public在类的继承上的体现,被public所修饰的成员能被所有的子类继承下来。
2、 protected
(1)定义:protected是受保护的,受到该类所在的包所保护。
(2)作用域:被protected所修饰的成员会被位于同一package中的所有类访问到。同时,被protected所修饰的成员也能被该类的所有子类继承下来。(注意:这里是指同一个package或者不同的package中的子类都能访问)
3、 default
(1)定义:default是默认,缺省的,即在成员的前面不写任何的访问修饰符的时候,默认就是友好的。所谓友好的,是对同一package的类友好。
(2)作用域:同一package中的所有类都能访问。被friendly所修饰的成员只能被该类所在同一个package中的子类所继承下来。(也就是说只有在同一个package中的子类才能访问到父类中friendly修饰的成员)
4、 private
(1)定义:private是私有的,即只能在当前类中被访问到,它的作用域最小。
(2)作用域:private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
返回值 表示方法要返回的数据类型(int/String/double......) 有void无返回值。
方法名
方法的名称,避免使用到java关键字,并且首字母小写,命名时使用驼峰命名法
骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式。
参数列表:
方法声明时可以定义参数列表,调用时需要传入实参
1.形参
也叫形式参数,方法声明时候的参数称为形参,如add(int a)
2.实参
也叫实际参数,方法调用时传入的参数,如add(1)
eg:
public static void main(String[] args) {
method("字符参数");//括号中为实参
}
private static void method(String str) {//括号中为形参
System.out.println(str);//将传入的参数打印输出
}
二、方法的重载
方法的重载是在一个类中可以定义多个方法名相同,但参数不同的方法。调用时,会根据不同参数自动匹配对应的方法。
本质:重载的方法,实际是完全不同的方法,仅仅是名称相同。
构成方法重载的条件:
形参类型,形参个数,形参的顺序不同
eg:
public class OverLoading {
public double add(int a,double b){
return a+b;
}
//形参位置不同可重构
public double add(double c,int d){
return c+d;
}
//类型不同
public int add(int a,int b){
return a+b;
}
//参数数量不同
public double add(double a,int b,double c){
return a+b+c;
}
}
三、可变参数
在我们不知到参数的个数的时候我们用普通的方法的重构可能需要构建很多方法来解决这个问题,而可变参数将可以很好的解决这个问题
格式:
public void methodName(DataType... args) { // 方法体 }
其中,DataType
是参数的类型,args
是参数名。args
实际上是一个数组,因此你可以像操作数组一样使用它。
public class Variable {
public int add(int d,int ... num ){
if(num.length == 0){
return 0;
}
else if(num.length == 1){
return num[0];
}
else{
int sum = 0;
for(int i = 0; i < num.length; i++){
sum += num[i];
}
return sum;
}
}
}
注: 1.可变参数只能出现在参数列表的最后 ,且一个方法中只能有一个可变参数
2.null值处理,如果可变参数可能接受null值,则需要对其处理
3.重载时若有具体参数的方法,只会被最后选择
四、方法的调用
【1】静态方法(Static Method)
定义:
使用static
关键字修饰的方法,属于类本身,不依赖于类的实例。
调用方式:
- 直接通过类名调用(推荐):
类名.方法名()
- 通过实例调用(不推荐,但语法允许):
实例名.方法名()
示例代码:
java
public class Calculator {
// 静态方法:计算两数之和
public static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
// 直接用类名调用静态方法
int result = Calculator.add(3, 5);
System.out.println("3 + 5 = " + result); // 输出: 3 + 5 = 8
// 也可以通过实例调用(不推荐)
Calculator calc = new Calculator();
result = calc.add(2, 4); // 不报错,但不推荐这种写法
}
}
【2】实例方法(动态方法)
定义:
没有static
关键字修饰的方法,属于类的实例,必须通过对象实例调用。
调用方式:
- 先创建类的实例
- 通过实例调用方法:
实例名.方法名()
示例代码:
java
public class Person {
private String name;
// 构造方法
public Person(String name) {
this.name = name;
}
// 实例方法:获取名字
public String getName() {
return this.name;
}
// 实例方法:打招呼
public void sayHello() {
System.out.println("Hello, I'm " + this.name);
}
public static void main(String[] args) {
// 创建实例
Person alice = new Person("Alice");
// 通过实例调用动态方法
System.out.println(alice.getName()); // 输出: Alice
alice.sayHello(); // 输出: Hello, I'm Alice
}
}
静态方法 vs 实例方法
特性 | 静态方法 | 实例方法 |
---|---|---|
关键字 | static | 无static |
归属 | 属于类,所有实例共享 | 属于类的实例 |
调用方式 | 类名。方法名 () 或 实例。方法名 () | 必须通过实例调用:实例。方法名 () |
访问权限 | 只能访问静态成员(静态变量 / 方法) | 可以访问所有成员(静态和实例) |
this 关键字 | 不能使用this | 可以使用this 引用当前实例 |
常见错误示例
错误 1:静态方法中直接访问实例变量
java
public class ErrorDemo {
private int value; // 实例变量
public static void printValue() {
System.out.println(value); // 错误!静态方法无法直接访问实例变量
}
}
错误 2:直接通过类名调用实例方法
java
Person.sayHello(); // 错误!必须先创建实例
总结
- 静态方法:适用于工具类方法(如
Math.random()
)、无需访问实例状态的场景。 - 实例方法:用于操作对象的属性和行为,需要依赖实例状态