第3章 面向对象编程基础
抽象(见课本39页)
抽象是程序设计最经常使用的技术之一,是有效控制程序复杂性的重要手段。
在面向对象程序设计中:
把一系列复杂的属性与动作组织到单个模块中,然后把该模块当作一个整体(对象)来对待,就是一种抽象形式。
把一个问题分解成构成它的对象,也是一种抽象形式。
对象(object)
万物皆为对象,它存储数据,还可以要求它在自身上执行操作。
对象具有状态、行为和标识。这意味着每一个对象可以拥有内部数据(它们给出该对象的状态)和方法(它们产生行为),并且每一个对象都可以唯一地与其他对象区分开来(每一个对象在内存中都有唯一一个地址)。
消息(message)
在面向对象框架中,对象之间通过相互发送消息来进行交互。
在Java里,通过调用方法来传递消息。
类(class)
类定义了某种类型的所有对象所具有的属性与行为,是用来创建对象的蓝图或模板;对象是某个确切类的实例。
在创建一个类的实例(对象)之前必须定义这个类。
继承性(inheritance)
继承机制:属于一个子类(派生类)的对象从其父类(基类)中继承了全部属性和行为。所有可以发送给父类对象的消息也可以发送给子类对象。
多态性(polymorphism)
对象的多态性是指在超类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个子类中具有不同的语义 。
联编(见课本41页)
联编是指将发送给对象的消息与包含执行该消息方法的对象连接起来。
静态联编:在编译和连接阶段实现的联编。
动态联编:在运行阶段实现的联编。
动态联编是实现适应性多态的基础。
类(见课本41-44页)
(1)类的声明
类的定义格式如下:
[类修饰词] class 类名 [extends 父类名]
[implements 接口名称列表]
{
类体
// 通常先定义成员变量,再定义构造方法,最后编写成员方法
}
(2)成员变量
成员变量的定义格式如下:
[修饰词列表] 类型 变量名或带初始化的变量名列表;
例如:private float height, weight;
private String name, sex, no;
(3)方法
类的成员方法:简称方法,用来实现类的各种功能。
方法的定义格式如下:
[方法修饰词列表] 返回类型 方法名(方法的参数列表)
{
方法体
}
例如: public int mb_method() { … }
public static void main(String args[])
{ … }
例3.2(若某方法的参数名或局部变量名与类的成员变量名相同,则成员变量名在这个方法内部暂时被隐藏。)
例3.3(关键字this:对当前对象的引用)
例3.4(方法重载)
(4)构造方法
构造方法用来创建类的实例,并对对象初始化。构造方法的声明和一般方法声明非常相似,但是它必须和类同名,并且不能声明返回值类型。构造方法的一般形式:
public <类名> ( <参数列表> ) { <语句> }
例3.5
默认的构造方法:当一个类没有包含构造方法时,Java将自动提供一个默认的构造方法。
对象(见课本44-46页)
(1)声明对象
声明一个对象只是命名一个引用变量,这个引用变量和对象关联,可以用来引用该对象。
声明一个对象的格式如下:
类名 变量名(对象名);
例如,声明对象:
Point p1,p2;
不要把声明一个对象和创建一个对象混淆起来。声明对象并不会为这个对象分配内存。
(2)创建对象
创建对象:使用new操作符和构造方法。
构造方法是在对象实例化过程中使用的特殊方法;
操作符new为新的对象分配一片内存并将它存储在那里,然后返回对象的地址。
格式为:
new 构造方法名(构造方法的调用参数列表)
例如:
p1 = new Point(); p2 = new Point(30,40);
声明和创建对象也可以一起完成,例如:
Point p3 = new Point(), p4 = new Point(60,70);
(3)对象的内存模型
在Java中有两种类型的变量:基本类型与引用类型。基本类型的变量总是存放一个该类型的值;引用变量实际上存放的是它所引用的对象的地址,而不是存放对象本身。在Java中,主要有数组和类类型是引用类型。
课本45页,图3.1、3.2
(4)使用对象
程序使用对象:
访问对象的成员变量,一般形式为:
对象名.成员变量名
调用对象的方法,一般形式为:
对象名.方法名([参数表])
例3.6
实例变量和类变量(见课本46页)
被关键字static修饰的变量为类变量(静态变量),未被关键字static修饰的变量为实例变量。
例如:
class D {
float x; // 实例变量
static int y; //类变量
…
}
每个对象都有自己的实例变量,不同对象的实例变量也将被分配不同的内存空间。
类变量则被一个类的所有对象共享,在内存中也只有一处。可以通过类名或对象名引用类变量。
实例方法和类方法(见课本46-48页)
被关键字static修饰的方法为类变量(静态方法),未被关键字static修饰的方法为实例方法。
例3.7
注意:类中的实例方法可以互相调用,并可调用类方法。类方法也能相互调用,但不能直接调用实例方法,而要通过在类方法中引入局部对象,通过对象名调用实例方法。
类中的实例方法中可以直接使用实例变量,也可直接使用类变量。但类方法能直接使用类变量,却必须通过在类方法中引入的局部对象,用对象名引用实例变量。
类方法可以通过类名或对象名调用。
例3.8
访问权限(见48-49页)
设置访问权限实现访问控制,为类的成员设置访问权限,保护类的成员不在非期望的情况下被引用。
在类的声明中,除了类的方法总能访问类的成员变量外,为其他类的方法访问本类的成员变量和方法,提供了四种访问权限:
public:无访问限制,其他类的方法都能访问
private:最强访问限制,其他类的方法都不能访问
protected:仅限子类或同一包中的类的方法访问
<default>:只允许同一包中的类的方法访问
继承(见课本49-53页)
继承性 - 软件重用的一种方法
继承使得一个类可通过扩展现有类来定义
扩展声明的新类称为子类,原有的类称为超类(父类)
子类继承超类的变量和方法;子类可以增加新的变量和方法;子类可以重写(第51页)从超类中继承的方法。
子类对父类的继承性,Java语言有以下规定:
子类自然地继承其父类中非private的成员变量作为自己的成员变量
子类自然地继承其父类中非private的成员方法作为自己的成员方法
例3.10
多态性(见课本51-52页)
静态的多态性:重载,在编译时就能够被识别针对的是同一个类内的同名方法(重载的方法)。
动态的多态性:重写,在程序运行时才被识别(动态联编)重写父类的方法(同样签名)。
例3.11
多层继承(见课本52页)
继承关系具有传递性。继承声明的新类,又可被其他类再继承,从而构成多层继承。
例3.12
多层继承中构造方法的调用顺序(见课本52-53页)
当前定义的类的构造方法必须调用其直接父类的构造方法,而且该调用语句必须是当前定义的类的构造方法的第一条语句,其调用格式是:
super(调用参数列表);
super是关键字,此处表示其直接父类的构造方法,调用参数列表必须与其直接父类的某个构造方法的参数列表相匹配。
例3.13
Java面向对象的其他机制(见课本53-58页)
(1) final类、final方法和final变量
关键字final的含义为“最终的”,“不能改变的”。用final修饰类,表明此类不能派生出子类,例如:final class C { … }
用final修饰方法,表明此方法不能被子类的方法重写(覆盖)
例如:final int f( int x, int y ) { … }
用final修饰变量,表明此变量一旦赋值,则不能再被改变,相当于一个常量
例如:final int FINALVAR = 100;
(2)abstract类和abstract方法
关键自abstract的含义为“抽象”,用abstract修饰类,此类称为抽象类,抽象类不能被实例化;用abstract修饰方法,此方法称为抽象方法,抽象方法没有实现的代码(方法首部; )包含抽象方法的类一定是抽象类,但抽象类可以没有抽象方法。
例3.14
(3)关键字super
关键字super的用途:在子类型的非静态成员方法中访问其父类型的成员变量
例3.15
(4)关键字this
关键字this的用途:在当前类的非静态成员方法中访问当前类的成员变量
例见课本57页
(5)类之间的is-a和has-a关系
例3.16:类A继承自类B,子类A与父类B之间有is-a关系
例3.17:类A的某个成员变量的类型是B,类A和类B之间是has-a关系
(6)内部类(inner class)
定义在其它类内部的类称为内部类。
接口(interface)
Java小应用程序基础(课本61-64页,简单应用、识记)
Java Applet
主要功能:显示图形、动画、播放声音、响应用户事件等。
Java applet 的实现主要依靠java.applet 包中的Applet类。
java. applet. Applet类是所有Java applet的基类,所有的Java applet都必须继承该类。
(1)小应用程序的建立和运行 (见课本59页)
Java applet程序从建立到运行的步骤如下:
1) 选用写字板或文本编辑器等工具建立Java applet源程序。(其中必须有一个类继承java.applet.Applet类,这个类是小应用程序的主类,用关键字public修饰。)
2) 把Java applet的源程序编译为字节码文件。
3) 编制HTML文件,通过<applet></applet>标记将字节码文件嵌入HTML文件中。
4) 在支持Java的浏览器上运行。
(2)Applet类的基本方法(见课本63页)
public void init( )
public void start( )
public void paint( )
public void stop( )
public void destroy( )
public void repaint( )
public void update( )
(4)小应用程序数据输入与输出 (见课本64页)
小应用程序的数据输入有多种方式:
从图形用户界面的文本框、文本区域中输入;
采用系统标准输入;
由HTML文件中的参数导入。