1、,2011.11.28,第三课时:Java的面向对象特性,2012年3月 ebadao,课程内容提要,程序设计方法的发展 面向对象语言简介 面向对象程序设计的四个特点 抽象:类与对象 封装与访问控制 继承 多态,程序设计方法的发展,面向对象语言简介,对象是什么 对象描述了问题域的概念 对象有状态(属性),有行为(方法) 对象间通过发送消息和方法响应进行互操作 对象隐藏实现方式,暴露出可供调用的方法 类是特定类型对象的定义,它是一种数据类型 类可以从类进行继承(is-a关系) is-a关系的对象能接受相同的消息面向对象语言基本特征 万物皆对象 程序就是一组相互之间传递消息,告诉对方该干些什么的对
2、象 每个对象都用别的对象来组建它自己 对象都有类型(类) 所有属于同一类型的对象能接受相同的消息,面向对象程序设计的四个特点,抽象性 指采用数据抽象的方法来构建程序的类、对象和方法,即把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。封装性 指利用类将数据和基于数据的操作封装在一起,数据被保护在类的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能与这个类进行交流和交互继承性 指一个类可以从其它已有的类中派生,新类保持了父类中的行为和属性,但增加了新的功能。 多态性 指一个程序中可以有同名的不同方法共存的情况。可以利用子类对父类
3、方法的覆盖和重载在同一个类中定义多个同名的方法来实现,面向对象程序设计的四个特点,任何一门面向对象的语言会从这四个方面(抽象,封装,继承,多态)考虑语言的支持特性进行取舍,并辅助已相关语法设计。 理解四个基本特性的意义比掌握语言的语法更重要,一旦你理解这四个特性能做到什么,为什么有需要这样的特性,剩下的事情就是找出相关的语法支持而已。那么任何一门面向对象的语言你都能使用。剩下的无法是多练多用,手熟而已.,抽象:类与对象,类是描述对象的“基本原型”,它定义一类对象所能拥有的数据和能完成的操作。在面向对象的程序设计中,类是程序的基本单元。 相似的对象可以归并到同一个类中去,就像传统语言中的变量与类
4、型关系一样。 程序中的对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。,抽象:类与对象,对象是具有某种特性和某种功能的东西。对象有两个层次的概念 现实生活中对象指的是客观世界的实体; 程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。 对象的状态(state):对象的静态属性,表现为对象本身信息的一组取值。 对象的行为(behavior):对象的动态属性,行为是对象自身的行动以及对外界激励的响应。 对象的标识:对象名。,抽象:类与对象,可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型来
5、描述的,这种抽象数据类型称为类(class),class Car int color_number; int door_number;int speed;void brake() void speedUp() void slowDown() ,抽象数据类型,抽象:类与对象,从类看对象:类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。 从对象看类:类的产生,是从少数实例,推广到大量相似实例的抽象化过程(abstraction)。 变量:指对象所拥有的状态。 方法:指对象的功能单元。 消息(方法调用):软件对象通过相互间传递消息来相互作用和通信,一个消息由三部分组成:1. 接
6、受消息的对象2. 接收对象要采取的方法3. 方法需要的参数,抽象:类与对象,上代码:Hello.java,package com.ckt.study.java.charpter3;class Hello private String s;/ 变量public void showString() / 方法System.out.println(s); public void changeString(String str) / 方法s = str; public static void main(String args) / 在程序中所操作对象是类的一个实例。 Hello hello = new
7、Hello(); / 创建对象 hello.changeString(“Hello“); / 调用对象的方法 hello.showString(); / 调用对象的方法 / 调用对象的方法相当于给对象发送消息,收到消息的对象通过改.变自身的状态或者向其它对象发送消息来响应消息。 ,如何抽象出类?,设计类的一个简单经验就是寻找问题分析中的名词 比如:在订单处理系统中有这样一些名词:订单(order)、送货地址(address)、货款(payment)、帐户(account)根据这些名词,我们就可以创建order、address、 payment、 account等类 确定类中的方法:通过寻找和名
8、词相关的动词来确定方法 比如:物品被添加进订单,订单被运送或取消 ,货款被支付,封装与访问控制,封装利用抽象数据类型将数据和基于数据的操作封装在一起。封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。封装的好处 隐藏类的实现细节 强制使用者通过接口访问数据 代码容易维护 可进行数据检查,封装实例,class MyDate public int day,month,year;public int setDay() MyDate d;,代码直接存取内部数据 (d是MyDate类的一个对象): d.day = 32; / 错误的日期 d.month = 2;
9、d.day = 30; / 合法不合理的赋值 d.day = d.day + 1;,封装实例,public Class MyDate private int day;private int month; private int year;public boolean setDay (int d) if (d31) return false;else day=d;return true; public int getDay() return day;,访问控制,封装的本质:其实就是隐藏不愿意公开的,开放愿意公开的 Java中对封装的支持,包括有通过访问控制符来控制类,成员变量,方法的可访问范围;
10、通过非访问控制符关键字如(static,abstruact , final)来控制类,成员变量,方法的访问特性.,访问控制,访问控制符的访问控制: private:只能在类的内部使用 默认访问:即成员方法或变量前没有访问控制符,只能被同一包中的其他类访问 protected:可以被包中的其他类访问,也可以被不同包中的子类访问 public:可以被所有的包访问,静态修饰符 : static,static关键字: static 用在变量或方法之前,表明它们是属于类的,称为类方法(静态方法)或类变量(静态变量)。若无static修饰,则变量和方法分别是实例的方法和变量。 类变量的生存期不依赖于对象,
11、其它类可以不用(而非不可)通过创建该类的实例,直接通过类名访问它们。 同样类方法也可以直接通过类名访问。 同一个类的实例方法可以访问该类的类变量和类方法。 类方法只能访问该类的类变量和类方法,不能直接访问实例的变量和方法 不能把方法体内的变量声明为static 类中可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块自动被执行,且只执行一次,静态代码块常用来进行类属性的初始化 参考 TestStatic.java,静态修饰符 : static,class ABCD char data; static int share_data; class Demo ABCD a,b,c,d;
12、 ,final关键字: final标记的类不能被继承 final标记的方法不能被子类重写 final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次 final标记的成员变量必须在声明的同时或在类的构造方法中显示赋值 final标记的局部变量相当于常量,它的声明周期超出方法的声明周期,可以被内部类访问 java中常用public static final标记的常量为全局常量 所有已被private修饰符限定为私有的方法,以及所有包含在final类中的方法,都被缺省地认为是final的。 参考 TestFinal.java,不可变关键字:final,abstract关键字: abstra
13、ct可以用来修饰类与方法。被abstract修饰的类,称之为抽象类;被abstract修饰的方法,称之为抽象方法 抽象类本身不能被实例化,抽象类中至少包含一个 抽象方法。 使用抽象类的优点就是可以充分利用公共属性来提高开发和维护程序的效率。 抽象方法只有方法头而无具体的方法体。方法体的具体实现由当前类的不同子类在各自的类定义中完成 Java中的模板模式的实现,借用了抽象类的特性. 参考 TestAbstract.java,抽象关键字:abstract,继承,继承是自动地共享具有层次关系的类(子类)和对象中的方法和数据的机制。 如下图所示: 当类Y继承类X时,就表明类Y是类X的子类,而类X是类Y
14、的超/父类。类Y由两部分组成:继承部分和增加部分。 增加部分是专为Y编写的新代码;继承部分可以是简单的等同,也可以更为丰富:如对性质重命名、重实现、复制、置空等。,Java中的继承,Java只支持单类继承,一个子类只能有一个父类。导致Java时间中的类图序列只能是树型结构,简化了真实世界中的网状结构。从而简化了编程模型. 如 class Subclass extends Superclass. 子类继承父类非私有的成员变量和成员方法,但不继承父类的构造方法,在子类的构造方法中可以用super(参数列表)调用父类的构造方法 如:如果子类的构造方法中没有显式地调用父类的构造方法,也没有使用this
15、关键字调用重载的其他构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法 Java中实现单继承机制的同时一个类可以实现多个接口,从而克服单继承的缺点 Object类是所有类的父类,所有的Java类都默认继承Object类,class Student extends Personpublic Student()super();/默认调用 ,Figure,Line,Ellipse,Polygon,Close Figure,Open Figure,Pentagon,Triangle,Rectangle,Circle,Arc,(象素宽度,颜色,平移,旋转),(填充,边界,周长,面积),
16、(长度),一个图形系统的继承树,继承关系下的类型转换,子类转父类:直接转换 父类转子类:强制转换 不相干的类型之间不能转换 类型判断:instanceof,继承关系下构造函数的调用规则,子类构造方法一定要调用父类构造方法 如子类没有手动调用父类构造函数,且父类存在无参构造函数,则编译器会自动调用父类无参构造函数 如父类没有无参构造函数,则子类必须手动调用父类构造方法进行初始化 使用super关键字调用父类构造函数,但是必须放在构造函数最前面 构造函数中无法处理父类构造函数抛出的异常,继承关系下的方法 覆写,继承关系下的方法覆写是多态特性实现的基础 方法覆写注意事项: 构造函数不能Overrid
17、e package/protected/public方法均可重写 方法签名必须一致 方法可见性可以增大,不能缩小 子类方法可以声明final 子类方法抛出异常可以减少,不能增多 调用父类方法:super,this & super,this关键字 this在类内部表示被构造的类对象本身 this的用法: this.本类属性,调用本类中的属性; this.本类方法(),可以不写this,也表示调用本类的; this 是访问本类中的其他构造,必须放在首行。super关键字 super关键字用于表示当前类的父类对象. super的用法: 调用父类构造器: 由于构造器不能继承,子类构造器会默认调用父类的
18、无参构造器,如果父类的构造器被重写,则需要子类显示的调用相关构造器。super是访问父类中构造函数的惟一途径.子类的构造函数如果要引用super的话,必须把super放在函数的首位,不然会出现这样的报错:call to super must be first statement in constructor 。 调用父类方法: 当子类覆写了父类的方法,而又想调用父类的相关实现的时候可以通过super关键字调用。,接口,接口代表一种协议/规约/数据类型 接口只有声明,没有实现 接口定义的所有方法均为public 接口定义的所有变量均为public static final 接口类实现接口-imp
19、lements关键字 接口可以继承多个接口-extends 接口的可见范围:public/package,不可以采用private修饰 全部有抽象方法组成的抽象类,可以定义成接口.,多态,运行时多态性是面向对象程序设计代码重用的一个最强大机制. Java实现运行时多态性的基础是动态方法调度,它是一种在运行时多态实现而不是在编译期调用重载方法的机制。方法的覆写Overriding和重载Overloading是Java多态性的不同表现。 重写Overriding是父类与子类之间多态性的一种表现. 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding).子类的对
20、象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。 重载Overloading是一个类中多态性的一种表现。 如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。 Overloaded的方法是可以改变返回值的类型。参考 TestPolymorphism.java类理解吧. 能解释通这个示例的童鞋掌握多态。,总结,本节课的主要内容是介绍面对对象语言的特性以及Java在实现面向对象语言特性过程中采用的机制。 抽象:对象是现实世界实体以属性和行为抽象的结果,类是对象的模板。 封装:通过访问控制符与非访问控制符关键字来控制可访问范围,达到公开愿意公开,关闭不愿意公开的目的。 继承:Java只支持类的单继承,利用接口的多继承来弥补现实世界中多继承的情况。 多态: Java提供了运行时绑定机制,通过方法覆写与重载在实现多态机制。本节课的重点在于Java中封装的实现以及继承与多态机制的理解.,作业,思考题 : 如果你是一个面向对象语言编程大师 a.你如何在C语言中实现面向对象的特性? b. C+中你最想移除掉那些非面向对象的成分?,