精通 Java:理解对象、类与核心 OOP 概念
Java 是面向对象语言。作为具备面向对象特性的语言,Java 支持以下基本概念:
- 多态
- 继承
- 封装
- 抽象
- 类
- 对象
- 实例
- 方法
- 消息传递
本章重点讲解类和对象概念。
对象 − 有状态和行为。例:狗有名字、品种、颜色等状态,吠叫、摇尾巴、奔跑等行为。对象是类的实例。
类 − 定义该类型对象支持的行为/状态的模板/蓝图。
Java 中的对象
现实世界中有许多对象:汽车、狗、人等。所有对象都有状态和行为。
以狗为例,状态:名字、品种、颜色;行为:吠叫、摇尾巴、奔跑。
软件对象与现实对象特征相似。软件对象也有状态和行为。状态存储在字段中,行为通过方法展现。
软件开发中,方法操作对象内部状态,对象间通信通过方法进行。
Java 中的类
类是创建单个对象的蓝图。
以下是类示例:
示例
public class Dog {
String breed;
int age;
String color;
void barking() { }
void hungry() { }
void sleeping() { }
}
类可包含以下变量类型:
局部变量 − 定义在方法、构造器或块内的变量。在方法中声明初始化,方法完成后销毁。
实例变量 − 类中但方法外的变量。类实例化时初始化。可从该类任何方法、构造器或块访问。
类变量 − 类中方法外用 static 关键字声明的变量。
类可有任意数量方法访问各类变量值。上例中 barking()、hungry()、sleeping() 为方法。
探讨 Java 类时需讨论以下重要主题:
构造器
讨论类时最重要的子主题是构造器。每个类都有构造器。若不显式编写,Java 编译器提供默认构造器,将所有成员变量初始化为零。一旦定义自己的构造器,默认构造器不再使用。
每次创建新对象至少调用一个构造器。构造器主要规则:名称与类同名。一个类可有多个构造器。
构造器示例:
示例
public class Puppy {
public Puppy() { }
public Puppy(String name) {
// 此构造器有一个参数 name
}
}
Java 还支持单例类,只能创建一个类实例。
注意 − 有两种不同类型构造器,后续章节详细讨论。
创建对象
如前所述,类提供对象蓝图。基本上,对象从类创建。Java 用 new 关键字创建新对象。
从类创建对象有三步:
声明 − 声明带对象类型的变量名。
实例化 − 用 'new' 关键字创建对象。
初始化 − 'new' 后跟构造器调用,初始化新对象。
创建对象示例:
示例
Live Demopublic class Puppy {
public Puppy(String name) {
// 此构造器有一个参数 name
System.out.println("Passed Name is :" + name );
}
public static void main(String []args) {
// 以下语句创建对象 myPuppy
Puppy myPuppy = new Puppy( "tommy" );
}
}
编译运行上程序将产生:
输出
Passed Name is :tommy
访问实例变量和方法
实例变量和方法通过创建的对象访问。访问实例变量的完整路径:
/* 首先创建对象 */ ObjectReference = new Constructor(); /* 现在调用变量 */ ObjectReference.variableName; /* 现在调用类方法 */ ObjectReference.MethodName();
示例
此例解释如何访问类的实例变量和方法。
Live Demopublic class Puppy {
int puppyAge;
public Puppy(String name) {
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
源文件声明规则
最后看源文件声明规则。声明类、import 语句和 package 语句时必不可少。
- 每个源文件只能有一个 public 类。
- 源文件可有多个非 public 类。
- public 类名应为源文件名并以 .java 结尾。例:类名 public class Employee{} 则源文件为 Employee.java。
- 类定义在包内时,package 语句应为源文件首行。
- 若有 import 语句,须写在 package 语句和类声明之间。无 package 语句时,import 语句应为源文件第一行。
- Import 和 package 语句对源文件所有类生效。无法为源文件不同类声明不同 import/package 语句。
类有多种访问级别和类型:抽象类、final 类等。将在访问修饰符章节详述。
除上述类型,Java 还有特殊类:内部类和匿名类。
Java 包
简单说,包是对类和接口分类。开发 Java 应用会编写成百上千个类和接口,分类管理至关重要且能简化工作。
Import 语句
Java 中若给出包含包和类名的全限定名,编译器易定位源码或类。Import 语句为编译器提供查找特定类的正确位置。
例如以下行要求编译器加载 java_installation/java/io 目录下所有类:
import java.io.*;
简单案例研究
案例研究创建两个类:Employee 和 EmployeeTest。
先打开记事本添加以下代码。这是 Employee 类,为 public 类。保存为 Employee.java。
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;
}
// 设置员工年龄
public void empAge(int empAge) {
age = empAge;
}
/* 设置职位 */
public void empDesignation(String empDesig) {
designation = empDesig;
}
/* 设置薪水 */
public void empSalary(double empSalary) {
salary = empSalary;
}
/* 打印员工详情 */
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 方法并创建对象。创建单独类完成这些任务。
以下是 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
下一步
下节将讨论 Java 基本数据类型及其在应用开发中的使用。
java