Java - 类和对象
Java 是一种面向对象的编程语言。在 Java 中,类和对象 是面向对象编程系统中的基本且重要的特性,Java 支持以下基本的 OOP 概念:
- Classes
- Objects
- Inheritance
- Polymorphism
- Encapsulation
- Abstraction
- Instance
- Method
- Message Passing
在本教程中,我们将学习 Java 类和对象、类和对象的创建、访问类方法等内容。
什么是 Java 类?
类 是一个蓝图,用于创建单个对象(或者说,类是对象类型的数据类型)。在 Java 中,一切都与类和对象相关。每个类都有其方法和属性,这些可以通过对象来访问和操作。
例如,如果你想为学生创建一个类,那么“Student”就是一个类,而学生记录(如student1、student2等)就是对象。
我们也可以将类视为一个工厂(用户定义的蓝图)来生产对象。
Java 类的特性
- 类不占用任何内存字节。
- 类就像现实世界的实体,但它不是现实世界的实体。它是一个蓝图,我们在其中指定功能。
- 类主要包含两样东西:方法和数据成员。
- 类也可以是嵌套类。
- 类遵循所有 OOP 规则,如 inheritance、encapsulation、abstraction 等。
类变量的类型
一个类可以包含以下任何类型的变量。
Local variables − 在方法、构造函数或代码块内定义的变量称为局部变量。变量将在方法内声明和初始化,当方法执行完毕时变量将被销毁。
Instance variables − 实例变量是类内的变量,但位于任何方法外部。这些变量在类实例化时初始化。实例变量可以从该类中的任何方法、构造函数或代码块内访问。
Class variables − 类变量是在类内声明的变量,位于任何方法外部,并使用 static 关键字。
创建(声明)Java 类
要创建(声明)一个类,需要使用访问修饰符,后跟class关键字和类名。
创建 Java 类的语法
使用以下语法在 Java 中创建(声明)类:
access_modifier class class_name{
data members;
constructors;
methods;
...;
}
Java 类的示例
在这个示例中,我们创建了一个名为“Dog”的类。其中,类的属性是breed、age和color。类的方法是setBreed()、setAge()、setColor()和printDetails()。
// 创建一个 Java 类
class Dog {
// 声明并初始化属性
String breed;
int age;
String color;
// 设置狗的品种、年龄和颜色的方法
public void setBreed(String breed) {
this.breed = breed;
}
public void setAge(int age) {
this.age = age;
}
public void setColor(String color) {
this.color = color;
}
// 打印所有三个值的方法
public void printDetails() {
System.out.println("狗的详细信息:");
System.out.println(this.breed);
System.out.println(this.age);
System.out.println(this.color);
}
}
什么是 Java 对象?
object 是 class 类型的变量,它是面向对象编程系统中的基本组件。一个 class 具有方法和数据成员(属性),这些方法和数据成员通过 object 进行访问。因此,object 是 class 的一个实例。
如果我们观察现实世界,会发现周围有很多对象,比如汽车、狗、人等。所有这些对象都有状态和行为。
以狗为例,它的状态包括 - 名字、品种和颜色,行为包括 - 吠叫、摇尾巴和奔跑。
如果将软件对象与现实世界的对象进行比较,它们具有非常相似的特性。软件对象也有状态和行为。软件对象的状态存储在字段中,行为通过方法体现。因此,在软件开发中,方法操作对象的内部状态,对象之间的通信也通过方法进行。
创建(声明)Java 对象
如前所述,class 为对象提供了蓝图。因此,基本上,对象是从 class 创建的。在 Java 中,使用 new 关键字来创建新对象。
从 class 创建对象有三个步骤 −
Declaration − 声明一个带有对象类型的变量名。
Instantiation − 使用 'new' 关键字创建对象。
Initialization − 'new' 关键字后跟构造函数调用。此调用初始化新对象。
创建 Java 对象的语法
考虑以下在 Java 中创建 class 对象的语法:
Class_name object_name = new Class_name([parameters]);
注意:parameters 是可选的,可以在使用 class 中的构造函数时使用。
创建 Java 对象的示例
在这个示例中,我们创建了 Dog class 的一个名为 obj 的对象,并访问其方法。
// 创建一个 Java class
class Dog {
// 声明并初始化属性
String breed;
int age;
String color;
// 设置狗的品种、年龄和颜色的方法
public void setBreed(String breed) {
this.breed = breed;
}
public void setAge(int age) {
this.age = age;
}
public void setColor(String color) {
this.color = color;
}
// 打印所有三个值的方法
public void printDetails() {
System.out.println("狗的详细信息:");
System.out.println(this.breed);
System.out.println(this.age);
System.out.println(this.color);
}
}
public class Main {
public static void main(String[] args) {
// 创建 Dog class 的对象
Dog obj = new Dog();
// 设置属性
obj.setBreed("Golden Retriever");
obj.setAge(2);
obj.setColor("Golden");
// 打印值
obj.printDetails();
}
}
输出
狗的详细信息: Golden Retriever 2 Golden
访问实例变量和方法
实例变量和方法通过创建的对象来访问。要访问实例变量,以下是完全限定路径 −
/* 首先创建一个对象 */ ObjectReference = new Constructor(); /* 现在按以下方式调用变量 */ ObjectReference.variableName; /* 现在按以下方式调用类方法 */ ObjectReference.MethodName();
示例
在这个示例中,我们创建了一个名为 Puppy 的类。在 Puppy 类的构造函数中,会打印小狗的名字,这样当对象创建时,就会打印其名字。我们添加了一个实例变量 puppyAge,并使用 getter/setter 方法来操作年龄。在 main 方法中,使用 new 操作符创建一个对象。使用 setAge() 方法更新年龄,并使用 getAge() 打印年龄。
public class Puppy {
int puppyAge;
public Puppy(String name) {
// 这个构造函数有一个参数,<i>name</i>。
System.out.println("Name chosen is :" + name );
}
public void setAge( int age ) {
puppyAge = age;
}
public int getAge( ) {
System.out.println("Puppy's age is :" + puppyAge );
return puppyAge;
}
public static void main(String []args) {
/* 对象创建 */
Puppy myPuppy = new Puppy( "tommy" );
/* 调用类方法设置小狗的年龄 */
myPuppy.setAge( 2 );
/* 调用另一个类方法获取小狗的年龄 */
myPuppy.getAge( );
/* 也可以按以下方式访问实例变量 */
System.out.println("Variable Value :" + myPuppy.puppyAge );
}
}
输出
如果我们编译并运行上述程序,它将产生以下结果 −
Name chosen is :tommy Puppy's age is :2 Variable Value :2
使用类和对象概念的规则
现在让我们来看看源文件声明规则(使用 Java 类和对象方法)。这些规则在源文件中声明类、import 语句和 package 语句时是必不可少的。
每个源文件只能有一个 public 类。
一个源文件可以有多个非 public 类。
public 类的名称也应该是源文件的名称,并在末尾附加 .java。例如 − 类名是 public class Employee{},则源文件应为 Employee.java。
如果类定义在 package 中,则 package 语句应是源文件中的第一条语句。
如果存在 import 语句,则它们必须写在 package 语句和类声明之间。如果没有 package 语句,则 import 语句应是源文件的第一行。
Import 和 package 语句将适用于源文件中所有类。不可能为源文件中的不同类声明不同的 import 和/或 package 语句。
类有几种访问级别,并且有不同类型的类;abstract classes、final classes 等。我们将在访问修饰符章节中解释所有这些。
除了上述类型的类之外,Java 还有一些特殊的类,称为 Inner classes 和 Anonymous classes。
Java 类和对象的更多示例
示例 1
Employee 类有四个实例变量 - name、age、designation 和 salary。该类有一个明确定义的构造函数,它接受一个参数。
import java.io.*;
public class Employee {
String name;
int age;
String designation;
double salary;
// 这是 Employee 类的构造函数
public Employee(String name) {
this.name = name;
}
// 将 Employee 的年龄赋值给 age 变量。
public void empAge(int empAge) {
age = empAge;
}
/* 将 designation 赋值给 designation 变量。*/
public void empDesignation(String empDesig) {
designation = empDesig;
}
/* 将 salary 赋值给 salary 变量。*/
public void empSalary(double empSalary) {
salary = empSalary;
}
/* 打印 Employee 详细信息 */
public void printEmployee() {
System.out.println("Name:"+ name );
System.out.println("Age:" + age );
System.out.println("Designation:" + designation );
System.out.println("Salary:" + salary);
}
}
正如本教程前面所述,处理从 main 方法开始。因此,为了运行这个 Employee 类,必须有一个 main 方法并创建对象。我们将为这些任务创建一个单独的类。
示例 2
以下是 EmployeeTest 类,它创建了两个 Employee 类实例,并为每个对象调用方法来为每个变量赋值。
将以下代码保存到 EmployeeTest.java 文件中。
import java.io.*;
public class EmployeeTest {
public static void main(String args[]) {
/* 使用构造函数创建两个对象 */
Employee empOne = new Employee("James Smith");
Employee empTwo = new Employee("Mary Anne");
// 为每个创建的对象调用方法
empOne.empAge(26);
empOne.empDesignation("Senior Software Engineer");
empOne.empSalary(1000);
empOne.printEmployee();
empTwo.empAge(21);
empTwo.empDesignation("Software Engineer");
empTwo.empSalary(500);
empTwo.printEmployee();
}
}
输出
现在,编译两个类,然后运行 EmployeeTest 以查看如下结果 −
C:\> javac Employee.java C:\> javac EmployeeTest.java C:\> java EmployeeTest Name:James Smith Age:26 Designation:Senior Software Engineer Salary:1000.0 Name:Mary Anne Age:21 Designation:Software Engineer Salary:500.0