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客户, 所以 DogLauncherDog 的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.binomend.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”。