1. 方法概述
在面向过程出现的时候,方法就出现了。在程序中要存储数据,会采用变量来存储,以方便我们复用。而方法的出现使为了存储程序中的功能代码,以方便我们复用。
例如:为了方便我们反复使用键盘录入功能,Scanner 类提供了一个 nextXX(),每次使用键盘录入直接调用该方法即可。
2. 方法的语法和分类
语法
// 方法声明
[访问权限修饰符] [其他修饰符] 返回值类型 方法名([方法的参数列表]) {
// 方法体
// 功能代码....
[return 返回值;]
}
访问权限修饰符:目前先认识一个 public
,代表公共的,意味着在项目中可以被使用。
其他修饰符:目前先认识一个 static
,代表静态的,后面专门讲。
返回值类型:一个方法,一个功能在执行完之后返回的数据的类型。 例如:nextInt() : int,因为你要获取到输入的数据,所以必须定义返回值,因为要得到的返回数据是整数所以返回值类型是int。
方法名:为了方便下次再使用,要起名。命名规范与变量名一致。
方法参数列表: 一个方法内部要执行的功能,有些时候是要进行某些数据处理,但是要处理的数据必须由你来提供给它,所以它需要提前规范好需要什么数据。例如:Arrays.toString(数组) : String
return:结束方法,并将返回结果返回到调用者位置。调用者可以将结果存储为变量或者直接输出等方式来使用。
把方法理解为榨汁机。
分类
以后学其他语言也基本是这4个分类。其他语言中可能叫函数、方法。
你们前期最害怕的事:就是不知道什么时候定义什么类型方法。建议多观察 Java 中的方法。
按照语法中是否有参数、是否有返回值来进行分类。
-
无参无返(没有参数、没有返回值)
一般这种方法,用于实现一些简单内容的输出或执行。
// 没有返回值,返回值类型需要定义为 void,代表空。 public void run() { System.out.printf("%s今年%d岁,身高%.1fcm,正在跑步!\n", name, age, height); }
使用过的该类型方法:
-
System.out.println();
public void println() { newLine(); }
-
-
有参无返(有参数、没有返回值)
一般这种方法,用于实现一些需要根据条件或者一些基础数据,才能实现输出或执行的场景。
// Arrays工具类中的方法,可以实现对传入的数组的元素进行升序排序 public static void sort(int[] a) { }
使用过的该类型方法:
-
System.out.println(1);
public void println(int x) { synchronized (this) { print(x); newLine(); } }
-
Arrays.sort(数组);
-
…
-
-
无参有返(没有参数,有返回值)
一般这种方法,适合于一些功能执行完可以返回一个结果的情况。因为没有参数,往往这类方法缺少灵活性、扩展性。
// Math.random() 生成[0.0, 1.0) public static double random() { return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble(); }
使用过的该类型方法:
nextInt() : int
nextDouble() : double
next() : String
random() : double
length() : int
- …
-
有参有返(有参数有返回值)
前期这种我们用的少,因为我们使用时一般都是用作于输出。后期用的越来越多,因为后期功能要求复杂。
// Arrays.toString() 将数组转换为字符串 public static String toString(int[] a) { return xxx; }
使用过的该类型方法:
toString(数组) : String
copyOf(数组, 长度) : 新数组
equals(字符串1, 字符串2) : boolean
- …
3. 构造方法
概述
构造方法,顾名思义就是 Java 中用于对象创建/实例创建的方法。
每个类都有一个默认的构造方法:无参构造方法,你不写也会有。
如果你写了任意一个构造方法,默认的无参构造将不再提供。(建议每个类都自己写个无参,以防止未来定义有参构造之后,无参没有了)
语法
[访问权限修饰符] 方法名([方法参数列表]) {
}
构造方法只有有参和无参两种,因为构造方法的作用就是为了创建该类型的对象,那也就没有必要写上返回值类型了。
构造方法的方法名必须和类名一致,意味着 Student 类的构造方法就是 Student()。
带参构造的用处
使用带参构造方法可以用于属性快速赋值。
public class Student {
public String name;
public int age;
public String classId;
// 无参构造方法
public Student() {
System.out.println("呵呵呵?");
}
// 带/有参构造方法
// 方法参数列表中的名字无所谓,随便写,主要重点在于类型
// 因为外界关注的是这个方法需要什么类型的参数,而不是参数名
public Student(String stuName, int stuAge, String stuClassId) {
name = stuName;
age = stuAge;
classId = stuClassId;
}
}
// 使用传统方式来创建对象并赋值
Student student = new Student();
student.name = "小明";
student.age = 18;
student.classId = "353";
// 通过带参构造方法来创建对象并赋值
Student student2 = new Student("小红", 17, "349");
4. this关键字
在局部变量和成员变量出现重名时,局部变量优先级更高(优先使用局部变量)。
就近原则。
如果真重名了,可以使用 this 关键字区分。
this 关键字: 单词含义:这个。
-
它代表着当前类的对象,只不过它是一种代词。 (自己、他、你…)
-
谁在使用当前方法,那么方法内的 this 代表的就是谁。
public class Student{
public String name;
public Student(String name) {
// 此刻 this 代表的就是xiaoMing对象
this.name = name;
}
public void printInfo() {
// 此刻 this 代表的就是xiaoMing对象
Sout("我的名字叫;" + this.name);
}
}
main() {
Student xiaoMing = new Student("小明");
xiaoMing.printInfo();
Student xiaoHong = new Student("小红");
}
可以使用 this 在当前类中,调用对象能调用的东西。
- 调用成员变量:this.属性名
- 调用方法:this.方法名()
- 调用构造:this([参数列表])
如果短期内没能理解,先掌握它什么时候使用。例如:在构造方法中用于区分成员变量和局部变量。
5. 成员变量和局部变量区别
定义的位置:
-
成员变量:定义在类中,方法外(一般称为属性)
-
局部变量(Local Variable):定义在类中,方法内
- 咱们最开始定义的变量都是局部变量,因为它们在main方法中
- 方法声明上的参数列表,也是局部变量
初始值不同:
- 成员变量:有初始值(默认值)、和当初数组一样
- 局部变量:没有初始值,不赋值不能使用
作用域不同:
变量作用域:与其直接所属的 {} 有关。
- 成员变量:在类中所有成员方法中都可以使用
- 局部变量:只能在定义它的方法中使用
生命周期不同: (生老病死,什么时候诞生,什么时候销毁)
- 成员变量:对象变量、实例变量,它是随着对象的创建而产生,随着对象的销毁而销毁
- 局部变量:随着它所在的方法中出现,随着方法结束而销毁
6. 方法重载现象
方法重载(Overload):在一个类中出现的方法名相同,参数列表不同的情况就被称为方法重载。与返回值类型、访问权限修饰符等无关!!!(例如:nextInt())
如果没有方法重载的支持,多个方法的方法名相同显然是不可能的。
例如:下方的四行输出语句,其实调用的不是一个方法,而是四个方法。
// println(String x) : void
System.out.println("xxx");
// println(int x) : void
System.out.println(111);
// println(double x) : void
System.out.println(12.5);
// println(char x) : void
System.out.println('x');
这样你就可以不需要记忆那么多的方法名,因为它们都是一样的功能。