跳转至

#

(Class)是 Java 中所有引用类型的基本单元。

我们在源文件一节中曾用到没有类的源文件。本节,我们将创建第一个 Java 类。

创建类#

创建一个类需要用class关键字。因为创建类是频繁操作,所以 IDE 为我们写好了模板,我们只需要对包名右击,选择New->Java Class->Class,并输入类名,就能生成一个普通的 Java 类。

例如,在com.example.myproject.animal包下创建Dog类,创建好的类如下:

Dog.java
package com.example.myproject.animal;

public class Dog {
}

其中package语句用于指定类所属的包。

访问权限#

类和其成员有一定的访问权限。用不同关键字修饰可得到不同结果:

关键字 同类访问 子类访问 同包访问 跨包访问
public
protected 1
无(package-private2
private
  1. 只有子类才能跨包访问。
  2. 对于接口的成员,没有关键字修饰则为public

需要注意的是,顶部类(即直接声明在源文件中的类)不能用protectedprivate修饰。用public修饰的顶部类,文件名和类名必须一致。

实例成员#

类的实例成员,就是只能通过类的实例访问的字段和方法。

实例字段#

声明在类中的变量我们称其为字段(Field)。字段可以被类中的方法访问。

Dog类中创建实例字段字符串name和整数age如下:

public class Dog {
    public final String name;
    public int age;
}

this对象#

在类的实例方法中,当方法的参数名、局部变量名或其他方法名与实例成员名冲突时,我们可以使用this访问其他实例成员。

public class Dog {
    // ...

    public void setAge(int age) {
        this.age = age;
    }
}

构造器#

为了在接下来创建实例时给类传入参数,我们需要用到一种特殊的方法:构造器(Constructor,又称构造方法、构造函数)。构造器没有返回值,名称和类名相同。

Dog类的构造器中传入nameage并初始化字段:

public class Dog {
    // ...

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

静态成员#

与实例成员不同,静态成员不需要通过类的实例访问,可以直接通过类名访问。也就是说,静态成员与类的实例无关。类的静态成员用关键字static修饰。

静态方法#

com.example.myproject包下创建一个Main类。在类中输入psvm并让 IntelliJ IDEA 自动补全:

Main.java
package com.example.myproject;

public class Main {
    public static void main(String[] args) {
    }
}

上面代码声明的main方法就是主方法的完整形式,包括public访问权限、static修饰符、void返回类型、main名称和一个String[]参数。

静态字段#

静态字段与类的实例无关,因此在不同的地方访问一个静态字段,无论类创建了多少个实例,访问到的永远是同一个字段。

输出内容#

要在类中输出内容,就需要用到System.outoutSystem类中的一个静态字段,代表输出流,它的类型是java.io.PrintStreamPrintStream类中为我们提供了写入内容的方法:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

printlnprint都支持输出多种类型的内容。

此外,输入sout,IntelliJ IDEA 可以自动补全为System.out.println

导入#

导入类#

引用其他包中的类时,为了避免每次都要写出包名,需要使用import语句。Java 默认导入了java.lang包。

用星号能导入包中所有类。

import com.example.myproject.animal.Dog; // 导入 Dog 类
import com.example.myproject.animal.*; // 导入 com.example.myproject.animal 中所有类

public class Main {
    // ...
}

静态导入#

import static语句能导入类中一个或所有静态成员。

import static com.example.myproject.animal.Dog.of;

public class Main {
    public static void main(String[] args) {
        var dog = of();
    }
}
public class Dog {
    public static Dog of() {
        // ...
    }
}

创建实例#

我们在数组一节中其实已经创建过实例,只是本节我们创建的是类的实例。new语句创建类的实例,并调用构造器:

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Dog A", 2);
    }
}

我们现在可以通过dog来访问Dog类的实例成员:

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Dog A", 2);
        dog.printInfo();
    }
}
public class Dog {
    // ...

    public void printInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

重载#

Java 类中的方法参数不同时可以有相同的名称,称为重载(Overloads)。方法重载与返回类型无关,参数相同、返回类型不同的方法不能重载,编译器会报错。

public class Dog {
    // ...

    public void eat() {
        System.out.println("Eat");
    }

    public void eat(String food) {
        System.out.println("Eat " + food);
    }
}