【CS61B】LEC2 Defining and Using Classes
1 Static vs Non-Static Methods
1.1 Static Methods
Java中的所有代码都必须是类class中的一部分,大多数代码在方法methods中:
public class Dog {
public static void makeNoise() {
System.out.println("Bark!");
}
}
如果运行 Dog
类,将会报错:
$ java Dog
Error: Main method not found in class Dog, please define the main method as:
public static void main(String[] args)
为了执行Dog类,我们需要添加一个main方法。或者,我们也可以单独创建一个 DogLauncher
类来执行 Dog
类:
public class DogLauncher {
public static void main(String[] args) {
Dog.makeNoise();
}
}
$ java DogLauncher
Bark!
一个类使用另一个类也叫做这个类的 client
客户, 所以 DogLauncher
是 Dog
的client
1.2 Instance Variables and Object Instantiation 实例变量和对象初始化
狗的叫声不是都是一样的,其中一种方法是为不同类型的Dog创建不同的类。
public class TinyDog {
public static void makeNoise() {
System.out.println("yip yip yip yip");
}
}
public class MalamuteDog {
public static void makeNoise() {
System.out.println("arooooooooooooooo!");
}
}
另一种方法是,类可以被实例化,而示例可以包含数据,所以我们创建Dog类的实例,并使Dog方法的行为取决于特定Dog的属性。为了更加具体,我们可以考虑以下的类:
public class Dog {
public int weightInPounds;
public void makeNoise() {
if (weightInPounds < 10) {
System.out.println("yipyipyip!");
} else if (weightInPounds < 30) {
System.out.println("bark. bark.");
} else {
System.out.println("woof!");
}
}
}
该方法使用Dog的方式为:
public class DogLauncher {
public static void main(String[] args) {
Dog d;
d = new Dog();
d.weightInPounds = 20;
d.makeNoise();
}
}
当该程序运行时,会输出“bark.bark.”
所以我们可以得到一些结论:
- Java中的对象是任何类的实例。
- Dog类具有自己的变量,也称为实例变量或非静态变量。 这些必须在类内部声明,这与Python或Matlab等语言不同,在Python或Matlab中,可以在运行时添加新变量。
- 我们在Dog类中创建的方法没有static关键字。 我们称此类方法为实例方法或非静态方法。
- 要调用makeNoise方法,我们必须首先使用new关键字实例化Dog,然后制作特定的Dog bark。 换句话说,我们调用
d.makeNoise()
而不是Dog.makeNoise()
。 - 实例化对象后,可以将其分配给适当类型的声明变量,例如:
d = new Dog()
; - 类的变量和方法也称为类的成员。
- 类的成员使用点表示法进行访问。
1.3 Constructors in Java (Java中的构造函数)
我们通常通过构造函数在面向对象语言中构造对象
public class DogLauncher {
public static void main(String[] args) {
Dog d = new Dog(20);
d.makeNoise();
}
}
这里的实例化是由参数的,为了使得该实例化符合语法,我们需要添加一个构造函数:
public class Dog {
public int weightInPounds;
public Dog(int w) {
weightInPounds = w;
}
public void makeNoise() {
if (weightInPounds < 10) {
System.out.println("yipyipyip!");
} else if (weightInPounds < 30) {
System.out.println("bark. bark.");
} else {
System.out.println("woof!");
}
}
}
每当我们尝试使用new关键字和单个整数参数创建Dog时,都会调用带有签名 public Dog(int w)
的构造函数。
1.4 数组实例化、对象数组
Java中使用 new
来实例化数组:
public class ArrayDemo {
public static void main(String[] args) {
/* Create an array of five integers. */
int[] someArray = new int[5];
someArray[0] = 3;
someArray[1] = 4;
}
}
相似的,我们可以在Java中创建实例化对象数组:
public class DogArrayDemo {
public static void main(String[] args) {
/* Create an array of two dogs. */
Dog[] dogs = new Dog[2];
dogs[0] = new Dog(8);
dogs[1] = new Dog(20);
/* Yipping will result, since dogs[0] has weight 8. */
dogs[0].makeNoise();
}
}
在这里,new
既用于创建含两个Dog对象的数组,也创建了单个的Dog
2 Class Methods vs. Instance Methods 类方法vs实例方法
Java允许我们定义两种方法:
- 类方法,即静态方法
- 实例方法,即非静态方法
实例化方法只能被一个特定的类的实例调用,静态方法只能被类本身调用。举个静态方法的例子,Math
类提供了一个 sqrt
方法,因为他是静态的,所以它允许:
x = Math.sqrt(100);
如果sqrt是实例方法,则下面将具有尴尬的语法。 幸运的是,sqrt是静态方法,因此我们不必在实际程序中执行此操作。
Math m = new Math();
x = m.sqrt(100);
有时,类中既有实例化方法也有静态方法,比如,我们想比较两条狗,我们可以用静态方法进行比较:
public static Dog maxDog(Dog d1, Dog d2) {
if (d1.weightInPounds > d2.weightInPounds) {
return d1;
}
return d2;
}
该方法可以被调用:
Dog d = new Dog(15);
Dog d2 = new Dog(100);
Dog.maxDog(d, d2);
另外还可以用非静态方法:
public Dog maxDog(Dog d2) {
if (this.weightInPounds > d2.weightInPounds) {
return this;
}
return d2;
}
Dog d = new Dog(15);
Dog d2 = new Dog(100);
d.maxDog(d2);
这里我们是用的特定的实例化变量进行调用方法。
3 静态变量
对于类而言,具有静态变量有时会很有用。 这些是类本身而非实例的固有属性。 例如,我们可能会记录到“狗”的学名是“ Canis handsomeis”:
public class Dog {
public int weightInPounds;
public static String binomen = "Canis familiaris";
...
}
我们应该通过类名而不是特定的实例来访问静态变量,即应使用 Dog.binomen
, 而不是 d.binomen
4 public static void main(String[] args)
到目前为止,我们已经了解到了,现在该使我们一直在使用main方法的声明变得神秘了。 分成几部分,我们有:
public
:到目前为止,我们所有的方法都以该关键字开头。static
:这是一个静态方法,不与任何特定实例相关联。void
:没有返回类型。main
:这是方法的名称。String [] args
:这是传递给main方法的参数。
4.1 Command Line Arguments 命令行参数
public class ArgsDemo {
public static void main(String[] args) {
System.out.println(args[0]);
}
}
$ java ArgsDemo these are command line arguments
these
4.2 Summing Command Line Arguments
Exercise 1.2.3: Try to write a program that sums up the command line arguments, assuming they are numbers. For a solution, see the webcast or the code provided on GitHub.
5 Using Libraries使用库
6 Overview总结
Client程序和Main方法 :没有main方法的Java程序无法使用java命令运行。 但是,可以使用另一类的main方法来调用一个类的方法。 使用另一个类的Java类称为该类的客户端。
类声明:Java类可以包含方法和/或变量。 我们说这样的方法和变量是类的“成员”。 成员可以是实例成员或静态成员。 静态成员用static
关键字声明。 实例成员是没有static
关键字的任何成员。
类实例化:类的实例化几乎总是使用new关键字完成的,例如 Dog d = new Dog()
。 Java中类的实例也称为对象。
点表示法:我们使用点表示法访问类的成员,例如 d.bark()
。 可以从同一班级或其他班级访问班级成员。
构造函数constructor:构造函数告诉Java当程序尝试创建类的实例时该怎么做,例如执行Dog d = new Dog()
时应执行的操作。
数组实例化:数组也使用new关键字实例化。如果我们有一个对象数组,例如Dog [] dogarray
,则数组的每个元素也必须分别实例化。
静态方法与实例方法:静态方法和实例方法之间的区别非常重要。实例方法是只能由类的实例(即特定对象)执行的操作,而静态方法则由类本身执行。实例方法是使用对特定实例的引用来调用的,例如d.bark()
,而静态方法应使用类名来调用,例如Math.sqrt()
。知道何时使用它们。
静态变量:变量也可以是静态的。静态变量应使用类名访问,例如Dog.binomen
与d.binomen
相反。从技术上讲,Java允许您使用特定实例进行访问,但是我们强烈建议您不要这样做,以免造成混淆。
void方法:不返回任何内容的方法应设置为void
返回类型。
this
关键字:在方法内部,我们可以使用this
关键字引用当前实例。
public static void main(String[] args):我们现在知道这些东西分别是什么意思:
- public:到目前为止,我们所有的方法都以该关键字开头。
- static:这是一个静态方法,不与任何特定实例相关联。
- void:没有返回类型。
- main:这是方法的名称。
- String [] args:这是传递给main方法的参数。
- 命令行参数。操作系统可以将这些参数作为“命令行参数”提供给您的程序,并且可以使用main中的args参数进行访问。例如,如果我们从命令行调用程序,例如java ArgsDemo,这些都是命令行参数,那么ArgsDemo的* main方法将具有一个包含字符串“ these”,“ are”,“ command”,“ line”,和“参数”。
使用库:在2017年,您无需从头开始构建所有内容。在我们的课程中,您被允许并强烈鼓励您使用Java的内置库以及我们提供的库,例如普林斯顿标准库。除了Java提供或内置的库以外,您不应使用其他库,因为它可能使某些作业无济于事,而且我们的自动分级机将无法访问这些库,并且您的代码也将无法使用。
从Internet获得帮助:欢迎您在线寻求帮助。但是,您应始终引用您的消息来源,并且不应就特定的家庭作业问题或项目寻求帮助。例如,使用谷歌搜索“如何转换String Java”或“如何读取文件Java”是可以的,但您不应搜索“ project 2 61b java berkeley”。
- 原文作者:jchen
- 原文链接:http://jchenTech.github.io/post/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E7%AE%97%E6%B3%95/CS61BLEC2/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。