一、概念
Java作为一种面向对象语言。支持以下基本概念:
- 多态
- 继承
- 封装
- 抽象
- 类
- 对象
- 实例
- 方法
- 重载
本节我们重点研究对象和类的概念。
对象:对象是类的一个实例,有状态和行为。。
类:类是一个模板,它描述一类对象的行为和状态。
类和对象之间的关系可以比喻为图纸和建筑的关系,类就像是建筑图纸,定义了建筑的结构和外观,而对象则是根据图纸实际建造出来的建筑物,每一栋都是基于同一图纸但可能有不同的颜色、位置或其他细节上的差异。
二、对象
现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
对比现实对象和软件对象,它们之间十分相似。
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
三、类
创建一个简单的类来理解下 Java 中类的定义:
// 学生类
public class Student {
// 姓名
private String name;
// 年龄
private int age;
// 学习方法
public void study() {
}
// 睡觉方法
void sleep() {
}
}
一个类可以包含以下类型变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 静态变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
一个类可以拥有多个方法,在上面的例子中:study() 和 sleep() 都是 Student 类的方法。
四、构造方法
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认的无参构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
下面是一个构造方法示例:
public class Student {
// 无参构造
public Student() {}
// 有参构造
public Student(String name) {}
}
五、创建对象
对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
下面是一个创建对象的例子:
public class Student {
// 无参构造
public Student() {}
// 有参构造
public Student(String name) {
System.out.println("学生的姓名:" + name);
}
public static void main(String[] args) {
// 创建 Student 对象,会调用有参构造方法
Student stu = new Student("张三");
}
}
编译并运行上面的程序,会打印出下面的结果:
学生的姓名:张三
六、访问实例变量和方法
通过已创建的对象来访问成员变量和成员方法,如下所示:
public class Student {
private final String name = "张三";
// 无参构造
public Student() {}
void Study() {
System.out.println("学生正在学习。。。");
}
public static void main(String[] args) {
// 实例化对象
Student stu = new Student();
// 调用成员变量
System.out.println("学生的姓名:" + stu.name);
// 调用成员方法
stu.Study();
}
}
运行结果:
学生的姓名:张三
学生正在学习。。。
使用 Student 类型声明的对象只能在编译时访问 Student 类中的方法和属性,但在运行时,你可以通过强制类型转换将其转换为特定类型,以便访问特定类型的方法和属性。
七、源文件声明规则
在本节的最后部分,我们将学习源文件的声明规则。Java的源文件指的是以 .java 为扩展名的文件,保存着你编写的java程序代码。
当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。
文件名和公共类名匹配:
- 如果源文件包含一个公共类(public class),那么源文件的名称必须与该公共类的名称完全相同,并且扩展名为.java。例如,如果公共类名为Student,则源文件必须命名为Student.java。
一个公共类
- 每个源文件只能包含一个公共类,但是可以包含多个非公共类(即私有、默认访问权限或受保护的类)。
包(Package):
- 如果类属于某个包,那么源文件的第一行必须是package语句,指定该类所在的包名。
包名通常遵循反向域名层次结构,如com.hui.utils。
导入(Import):
import语句用于引入其他包中的类或接口。
- 如果存在package语句,import语句必须紧随其后,位于所有类定义之前。
- 如果没有package语句,import语句应该出现在源文件的开始,位于类定义之前。
八、包
包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。
九、import 语句
在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类,并使用其属性和方法。
例如,下述就是将 Scanner
类导入进来:
import java.util.Scanner;