【JavaSE】3、方法
1.何谓方法
方法:解决一类问题的步骤的有序组合,包含于类或对象中;方法在程序中被创建,在其他地方被引用。
设计方法的原则:保持方法的原子性,就是一个方法只完成1个功能,这样利于后期的扩展。
tips:System.out.println(),那么它是什么呢?调用系统类System中的标准输出对象out的printIn方法。
2.方法的定义及调用
方法包含一个方法头和一个方法体。
1、方法定义:
- 修饰符:可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。如public。
- 返回值类型:是方法返回值的数据类型。有些方法没有返回值,这时returnValueType是void。
- 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数:是可选的。形式参数:在方法被调用时用于接收外界输入的数据。实参:调用方法时实际传给方法的数据。
- 方法体:方法体包含具体的语句,定义该方法的功能。
- return:如果有返回值,return需要放在最后。还可被用来终止方法。
2、调用方法:对象名.方法名(实参列表)
Java支持两种调用方法的方式,根据方法是否返回值来选择:
-
当方法返回一个值的时候,方法调用通常被当做一个值。
-
如果方法返回值是void,方法调用一定是一条语句。
3.按值调用&按引用调用
java是按值调用。方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值,这句话相当重要,这是按值调用与引用调用的根本区别。
1、按值调用(call by value):表示方法接受的是——调用者提供的值。
package github.method;
public class HomeWork01 {
private static int x = 10;
public static void updataeValue(int value){
value = 3 * value;
System.out.println("value的值:" + value);
}
public static void main(String[] args) {
System.out.println("调用前的值:" + x); // 10
updataeValue(x); // 30,方法中value被初始化为x的一个拷贝,方法结束后,value被回收。
System.out.println("调用后的值:" + x); // 10
}
}
结论:当传递方法参数类型为基本数据类型(数字以及布尔值)时,一个方法是不可能修改一个基本数据类型的参数。
2、按引用调用(call by reference):表示方法接收的是——调用者提供的变量地址(C语言是指针,当然java没有指针的概念)
java中除了基本数据类型还有引用数据类型
,也就是对象引用
,对于这种数据类型是什么情况呢?看下面例子:
// 一、声明一个User对象类型
package github.method;
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 二、执行class
package github.method;
public class HomeWork02 {
public static void updateUser(User student){
student.setName("subeiLY"); // 2、student的setName作用在引用对象上,User对象内部值被修改。
}
public static void main(String[] args) {
User user = new User("SUBEI");
System.out.println("调用user前:" + user.getName()); // SUBEI
updateUser(user); // 1、student变量被初始化为user值的拷贝,这里是一个对象的引用
// 3、updateUser方法结束后,student被释放,但user还没有变,依然指向User对象。
System.out.println("调用user后:" + user.getName()); // subeiLY
}
}
结论:User的值被改变了,但这是将最开始所对应得值改变了,把User的本身属性改变了,才会进行值得变化,虽然看似是按引用传递值,但是实际上是将值改变了。
到这里可能有些蒙逼,下面通过一个反例来说明:
package github.method;
public class HomeWork03 {
public static void swap(User x,User y){
User temp = x;
x = y;
y = temp;
}
public static void main(String[] args) {
User user = new User("user");
User stu = new User("stu");
System.out.println("调用前user:"+ user.getName()); // user
System.out.println("调用前stu:"+ stu.getName()); // stu
swap(user, stu); // x、y被初始化为两个对象引用的拷贝,方法并没有改变存储在变量user和stu中的对象引用
System.out.println("调用后user:"+ user.getName()); // user
System.out.println("调用后stu:"+ stu.getName()); // stu
}
}
这个过程说明了java对对象采用的不是引用调用,而是对象引用进行的是值传递,这里可以简单理解为这就是按值调用和引用调用的区别。
必须明白即使java函数在传递引用数据类型时,只是拷贝了引用的值,之所以能修改引用数据是因为它们同时指向了一个对象,但这仍然是按值调用而不是引用调用。
总结:
- 一个方法不能修改一个基本数据类型的参数(数值型和布尔型)。
- 一个方法可以修改一个引用所指向的对象状态,但这仍然是按值调用而非引用调用。
- 上面两种传递都进行了值拷贝的过程。
4.方法重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数。
1、方法的重载的规则:方法名称必须相同。参数列表必须不同(个数不同,或类型不同,参数排列顺序不同等)。方法的返回类型可以相同也可以不相同。
实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
tips:命令行传参——运行一个程序时传递给它消息,这要靠传递命令行参数给main()函数实现。(在文件所在目录编译java文件,在src下运行class文件)
2、可变参数
JDK1.5开始,Java支持传递同类型的可变参数(不定项)给一个方法。
在方法声明中,在指定参数类型后加一个省略号(...)。一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
public void test(int... i){}
5.总结:
方法的调用:
静态方法:可以通过类直接调用,在类加载时加载,不能调用非静态方法。
非静态方法:通过实例化对象调用
public class Demo {
public static void main(String[] args) {
Student1.say(); // 通过类调用静态方法(static)
// Student2.say(); 会报错,不能通过类直接调用非静态方法(public)
Student2 student2 = new Student2(); // 通过实例化对象调用非静态方法(public)
student2.say();
}
}
public class Student1 {
public static void say(){
System.out.println("学生说话了");
}
}
public class Student2 {
public void say(){
System.out.println("学生说话了");
}
}