方法
在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;
但是我们在赋值对象时, 和赋值基本对象的值有一点区别. s1
和joe
是两个不同的引用指向同一个对象 . s1 == joe
是true
,这意味着我们运行方法时改变 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的全名.