概述
语言的OOP特性
Java语言支持面向对象程序语言的三个特性:封装、继承和多态
将数据的数据和操作数据的方法结合起来,并且通过方法将对象的数据和实现细节隐藏起来,就叫做封装。封装实现了对象的数据隐藏,方便对象在系统内的传递,也保证了数据的一致性并使程序易于维护。
当一个类是另一个类的特例时,这两个类就具有继承关系。子类集成了父类的属性和方法,可以重用父类中的这部分代码。Java中只支持类之间的单继承,多继承可以通过接口来实现。
多态含义为“对外一个接口,内部多种实现”。Java语言支持两种形式的多态:运行时多态和编译时多态。通过方法的重载(overloading)实现编译时多态,通过类之间的继承,接口实现实现运行时多态。多态使程序具有良好的可扩展性和可维护性。
Java中类和对象的基本概念
类是特定类型对象的定义,包括:对象包含的数据,对象的创建及对象对自身数据操作的方法。类是一个模板。对象是在其类模型基础上构造出的,是具体的实例。
类定义:
Class EmpInfo{
String name;
String designation;
String department;
void print( ){
System.out.println(name+“is”+ designation+“at”+department);
}
}
对象的生成与使用:
EmpInfo employee = new EmpInfo( );
employee.name = " Robert Javaman";
employee.designation = "Manager";
employee.department = "Coffee shop";
employee.print( );
类的定义
类的基本结构
类声明的完整格式如下:
[public][abstract|final] class ClassName [extends SuperClassName] [implements InterfaceNameList]{}
出现在大括号{}中的类体,类体提供了这个类的对象在生命周期中需要的所有代码:构造和初始化新对象的构造方法,表示类及其对象状态的变量,实现类及其对象行为的方法等。
对象的生命周期
创建对象,使用对象,清除不用的对象。当一个对象完成了所有操作后,将被垃圾收集器收集,它所占用的资源将被回收并由系统提供给其他对象使用。
对象创建与初始化过程如下:
(1) 首先为对象分配内存空间,并将成员变量进行初始化:数值型变量初值为0;逻辑型为false;引用型变量为null
(2) 然后执行显式初始化,即执行在类成员声明时带有的简单赋值表达式
(3) 执行构造方法,进行对象的初始化。
在Java中,我们可以创建所需要的许多对象,运行系统会在确定某个对象不再使用时自动将其删除,这个过程叫做垃圾回收(garbage collection)。垃圾收集器收集的对象是确认不存在任何引用的对象。我们可以显式地删除一个对象的引用,即将改引用型变量值置为null。
类的继承与多态
类之间的继承关系是面向对象程序设计语言(OOP)的基本特征之一,是类之间的“is a”关系,反映出一个类(子类)是另外一个类(父类)的特例。
子类继承父类的属性、功能(方法),子类中只需声明特有的东西。
带private 修饰符的属性、方法是不能被继承的;构造函数不能被继承。
在方法中调用构造方法用this();调用父类的构造方法用super()。
super关键字指向该关键字所在类的父类,用来引用父类中的成员变量或方法。
Java中任何一个子类的实例都可作为父类的实例使用,可以调用父类具有的方法。
子类可以改变从父类继承的行为(重写,Override),被重写方法的返回值、方法名、参数列表与父类中的方法完全一样。方法重写的规则如下:必须返回与原来方法完全相同的返回值;方法的访问权限不能缩小;不能抛出新的例外。
子类对象的创建与实例化的过程:
(1) 分配对象所需要的全部内存空间,并初始化为“0”值
(2) 按继承关系,自顶向下显式地初始化
(3) 按继承关系,自顶向下调用构造方法
class Employee{
private Temp t1 = new Temp();
public Employee(){
System.out.println("Employee constructor");
}
}
class Manager extends Employee{
private Temp t2 = new Temp(2);
public Manager(){
System.out.println("Manager constructor");
}
public static void main(String[] args) {
new Manager();
}
}
class Temp {
public Temp(){
System.out.println("temp constructor1");
}
public Temp(int flag){
System.out.println("temp constructor2");
}
}
打印结果为:
temp constructor1
Employee constructor
temp constructor2
Manager constructor
可以看出实例化过程是按照继承关系自顶向下依次进行。