【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("学生说话了");
    }
}
原文地址:https://www.cnblogs.com/mind18/p/15408600.html