方法


在Java中方法(或者叫做功能函数)都是定义在内的内容 如下:

public class Main {
    public static void foo() {
        // Do something here
    }
}

foo 是我们在类Main中定义的方法. 下面是需要主要方法 foo 的一些事

  • static 意思是这个方法属于类Main 而不是属于类Main实例化的某个对象 . 也就是说我们可以在另外一个类里面像这样 Main.foo() 一样直接用。
  • void 意思是这个方法没有返回值。 在Java中也可以给方法定义一个 返回值 ,这个需要在方法声明。
  • 现在这个方法没有任何参数, 但是在其他场景Java方法可以有一个或多个参数,稍后我们会看到。

带参的方法 Arguments

我们通常的Java方法的参数是值传递, 但是可能有人不会同意我的这个词汇 或讲法, 最好的解释办法是实际操作,了解它到底是怎么执行的,结果是什么.

值传递表示 当方法运行时,将会拷贝参数,然后在方法内使用。下面是我们定义的方法

public void bar(int num1, int num2) {
    ...
}

这是在另外一个地方调用这个方法

int a = 3;
int b = 5;
bar(a, b);

bar(a, b 运行时,你可以想象运行 bar 的后两行加上一个这样的代码 :

int num1 = a;
int num2 = b;

然后在执行方法其余的部分

这意味着 a 的值拷贝到 num1 and b 的值拷贝到 num2. 在方法内改变 num1 and num2不会影响 a and b.

如果参数是对象,规则时一样的,但是执行时有一点点区别. 如下:

public void bar2(Student s1, Student s2) {
    ...
}

现在我们使用这个方法

Student joe = new Student("joe");
Student jack = new Student("jack");
bar2(joe, jack);

同样我们开始运行bar2时相当于加入这两句话

Student s1 = joe;
Student s2 = jack;

但是我们在赋值对象时, 和赋值基本对象的值有一点区别. s1joe 是两个不同的引用指向同一个对象 . s1 == joetrue,这意味着我们运行方法时改变 s1 同时会改变joe . 但是我们改变s1引用指向到其他值, 那么不会影响到索引 joe.

s1.setName("Chuck"); // joe 的 name 也会变为 Chuck 
s1 = new Student("Norris"); //  s1 是一个新的 student对象 , 已经和 joe指向的对象不同了
// s1 == joe    这个时候s1 和 joe 已经不想等了 为false

非静态方法

非静态方法在Java中比静态方法用得多得多。非静态方法只能通过对象调用,而不像静态方法可以直接通过类调用(整个类都能用,不需实例化类)

非静态方法可以访问和修改该对象的field变量 如下的 name 值。

public class Student {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

调用方法需要 Student 类的对象 如下

Student s = new Student();
s.setName("Danielle");
String name = s.getName();

Student.setName("Bob"); // Will not work!不能执行 这是静态方法的方式
Student.getName(); // Will not work!

总结

-每个Java方法必须在类中 -静态方法属于类,而非静态方法属于对象 -所有函数的参数是按值传递,基本类型的内容被复制,而对象不会被复制,有些人会说“按引用传递”

Exercise

在student类中写一个叫 printFullName 的方法,打印student的全名.