功能Functions
在Java中,所有函数定义必须在类中。我们也称函数方法。我们来看一个示例方法
public class Main { public static void foo() { // Do something here }}
foo
是我们在Main类中定义的方法。注意一些事情foo
。
-
static
表示此方法属于Main类,而不属于Main的特定实例。这意味着我们可以从不同的类中调用该方法。Main.foo()
-
void
表示此方法不返回值。方法可以在Java中返回单个值,并且必须在方法声明中定义。但是,您可以单独使用return
它来退出该方法。 -
这个方法没有得到任何参数,但当然Java方法可以得到参数,我们将进一步看到。
参数
我总是喜欢说Java方法的参数是通过值传递的,尽管有些人可能不同意我选择的单词,我发现它是解释和理解它如何正常工作的最佳方式。
按值表示在方法运行时复制参数。我们来看一个例子。
public void bar(int num1, int num2) { ...}
这是代码中的另一个地方,其中调用了bar
int a = 3;int b = 5;bar(a, b);
你可以想象一下,在运行时,就像在下面两行的开头写的那样:bar(a, b)
bar
int num1 = a;int num2 = b;
然后才运行该方法的其余部分。
这意味着将a
值复制到num1
并b
复制值num2
。改变num1
和num2
不会影响a
和的值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
s1
joe
s1
joe
s1.setName("Chuck"); // joe name is now Chuck as wells1 = new Student("Norris"); // s1 is a new student, different than joe with the name of Norris// s1 == joe is not true anymore
非静态方法
Java中的非静态方法比静态方法更多。这些方法只能在对象上运行,而不能在整个类上运行。
非静态方法可以访问和更改对象的字段。
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方法都必须在一个类中
-
静态方法属于一个类,而非静态方法属于对象
-
函数的所有参数都按值传递,原始内容被复制,而对象不被复制,有些人会说“通过引用传递”