cs61b class2--Intoduce to Java.Objects

1.class里面定义的method需要在main()里面调用才会生效,e.g.

public class Dog {
   public static void makeNoise(){
    System.out.println("bark");
   }  
}

这是Dog.java,里面有一个method,makeNoise(),然后我们可以实现在DogLauncher.java文件中调用它,代码是

public class DogLauncher{
    public static void main(String[] args){
        Dog.makeNoise();
    }
}

值得注意的是,在使用命令行执行时,Dog.java和DogLauncher.java都需要用javac编译之后才能运行
cs61b class2--Intoduce to Java.Objects_第1张图片
这是踩坑点,最开始我只javac DogLauncher.java,会报错


2.实例化class

假设我们给Dog类定义一个变量weight,用以表示狗的质量,
public int weight
那么我们在DogLauncher类里面调用时,可以使用关键字new,即

Dog d;
d=new Dog();
d.weight=20;

这样去实例化一个class,也就是这里的d


3.class的构造函数

相当于c++,需要一个与类名同名的函数作为构造函数,从而在初始化类实例时可以往构造函数里面传参,格式是

constructor:
public classname(type variable){

}

举例

public class Dog {
 public int weight;
 public Dog(int w){
    weight=w;
 }
}

当我们在main()里面传参时,就会将w赋值给weight
因此在main()里面调用是

Dog d;
d=new dog(20);

这样,weight被初始化为20,当Dog()被实例化为d之后,我们调用其makeNoise()方法就有确切的调用了,使用d.makeNoise(),而不是使用类名:Dog.makeNoise().


3.Array Instantiation, Arrays of Objects

对象数组,与int[ ],String[ ]类似,我们也可以声明Dog[ ],这表示是一个Dog class类型的数组

public class DogArrayDemo {
    public static void main(String[] args) {
        Dog[] dogs = new Dog[2];
        dogs[0] = new Dog(8);
        dogs[1] = new Dog(20);
        dogs[0].makeNoise();
    }
}

我们两次使用到了关键字new,
第一次是为数组开辟空间,new Dog[2],
第二次是为数组元素开辟class的空间。dogs[0]=new Dog(8),表示将对象数组实例化并传参给weight=8
一个小练习
https://cscircles.cemc.uwater...


4.静态方法与实例方法(非静态方法)的比较

区别1:
static method不针对特定的实例,任何实例调用它都是一样的结果,例如:

public class Dog {
    public int weightInPounds;
    public static String binomen = "Canis familiaris";
    ...
}

我们给Dog类定义一个学名,叫做Canis familiaris,那么无论是
System.out.println(Dog.binomen)
还是

Dog d1=new Dog();
System.out.println(d1.binomen)

或者

Dog d2=new Dog();
System.out.println(d2.binomen);

最后的结果都是狗的学名是Canis familiaris
也就是说static method不针对特定的某某狗,而是所有狗都是这个结果
区别2:
non-static method的访问是使用实例名,
static method的访问是使用类名,
上述区别1中,我们使用d1.binomen其实是错误的,虽然可以运行,但是实际上不允许使用实例名去调用静态方法。
举例调用:
静态方法:使用类名访问:

public static Dog maxDog(Dog d1, Dog d2) {
    if (d1.weight > d2.weight) {
        return d1;
    }
    return d2;
}

这是定义在Dog类的static method,我们在main()中去调用它:

Dog d = new Dog(15);
Dog d2 = new Dog(100);
Dog.maxDog(d, d2);

请注意,调用maxDog时,使用的是Dog.maxDog()
非静态方法的访问:

public Dog maxDog(Dog d2) {
    if (this.weight > d2.weight) {
        return this;
    }
    return d2;
}

此时没有关键字static,上面,我们使用关键字this来引用当前对象。例如,可以使用以下命令调用此方法:

Dog d = new Dog(15);
Dog d2 = new Dog(100);
d.maxDog(d2);

请注意,此时调用maxDog()是用实例名d.maxDog()


命令行参数

考虑一下
public static void main(String[] agrs)
各个字段的含义
public:到目前为止几乎所有method都会加这个前缀
static:表示静态方法,不针对任何特定的实例
void:返回值类型,不返回任何值
main:函数名称
String[] args:String类型的数组,数组名为args

因此,如果我们打印args数组的第一项,会得到什么?
System.out.println(args[0]);
答案是,报错数组越界,因为我们并未传递任何参数,正确的使用方法是,在解释器阶段传参

javac hellow.java
java hellow 1 2 3

我们传递参数"1 2 3"字符串,所以args[0]就是1
cs61b class2--Intoduce to Java.Objects_第2张图片


使用库

一些关于Java的库:
1.oracle:
cs61b class2--Intoduce to Java.Objects_第3张图片
2.Princeton University:
http://introcs.cs.princeton.e...


Some key observations and terminology:

An Object in Java is an instance of any class.
The Dog class has its own variables, also known as instance variables or non-static variables. These must be declared inside the class, unlike languages like Python or Matlab, where new variables can be added at runtime.
The method that we created in the Dog class did not have the static keyword. We call such methods instance methods or non-static methods.
To call the makeNoise method, we had to first instantiate a Dog using the new keyword, and then make a specific Dog bark. In other words, we called d.makeNoise() instead of Dog.makeNoise().
Once an object has been instantiated, it can be assigned to a declared variable of the appropriate type, e.g. d = new Dog();
Variables and methods of a class are also called members of a class.
Members of a class are accessed using dot notation.

你可能感兴趣的:(java)