类#
类(Class)是 Java 中所有引用类型的基本单元。
我们在源文件一节中曾用到没有类的源文件。本节,我们将创建第一个 Java 类。
创建类#
创建一个类需要用class
关键字。因为创建类是频繁操作,所以 IDE 为我们写好了模板,我们只需要对包名右击,选择New->Java Class->Class
,并输入类名,就能生成一个普通的 Java 类。
例如,在com.example.myproject.animal
包下创建Dog
类,创建好的类如下:
package com.example.myproject.animal;
public class Dog {
}
其中package
语句用于指定类所属的包。
访问权限#
类和其成员有一定的访问权限。用不同关键字修饰可得到不同结果:
关键字 | 同类访问 | 子类访问 | 同包访问 | 跨包访问 |
---|---|---|---|---|
public |
||||
protected |
1 | |||
无(package-private 2) |
||||
private |
- 只有子类才能跨包访问。
- 对于接口的成员,没有关键字修饰则为
public
。
需要注意的是,顶部类(即直接声明在源文件中的类)不能用protected
或private
修饰。用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
类的构造器中传入name
和age
并初始化字段:
public class Dog {
// ...
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
静态成员#
与实例成员不同,静态成员不需要通过类的实例访问,可以直接通过类名访问。也就是说,静态成员与类的实例无关。类的静态成员用关键字static
修饰。
静态方法#
在com.example.myproject
包下创建一个Main
类。在类中输入psvm
并让 IntelliJ IDEA 自动补全:
package com.example.myproject;
public class Main {
public static void main(String[] args) {
}
}
上面代码声明的main
方法就是主方法的完整形式,包括public
访问权限、static
修饰符、void
返回类型、main
名称和一个String[]
参数。
静态字段#
静态字段与类的实例无关,因此在不同的地方访问一个静态字段,无论类创建了多少个实例,访问到的永远是同一个字段。
输出内容#
要在类中输出内容,就需要用到System.out
。out
是System
类中的一个静态字段,代表输出流,它的类型是java.io.PrintStream
。PrintStream
类中为我们提供了写入内容的方法:
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
println
和print
都支持输出多种类型的内容。
此外,输入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);
}
}