设为首页 加入收藏

TOP

Java咖啡馆(8)――大话面向对象(下)(一)
2014-11-23 21:39:32 】 浏览:3076
Tags:Java 咖啡馆 大话 面向 对象
构思这篇咖啡馆的时候时值奥运圣火熊熊燃烧,看到中国奥运代表团努力为国争光,不由不决定把这次的主题献给我们的奥运健儿!

面向对象编程

  如果你是Java咖啡馆的常客,那么在不知不觉中你早已接触并运用过Java的面向对象知识。在这回的咖啡馆中,让我们详细剖析一个面向对象编程的实例,把知识巩固下来。

  奥运是国际性的运动盛会,中国运动员自然要用英文形式的名字才便于同国际接轨。这回要编写的程序便是用来解析英文名字的工具。通常,Gary Chan这样的英文名字形式表示名在前、姓在后。而Yao, Ming这样的形式则表示姓在前名在后。大家千万不要以为Gary在这里平白无故用Yao, Ming打广告,Yao初中时候可是跟Gary一个班的,他被语文老师仰着头臭骂痛哭后,经常是Gary安慰他,并经常一同骑车回家。看着今日的Yao已经是世界级的运动员为国争光了,Gary更需要加倍努力了……

  OK,言归正传,我们的程序将自动判断名字形式,并且分解出姓和名。还是老规矩,请用Eclipse生成一个名为Chap 07 NameParser的项目,并且加入一个新的名为NameParser类,在Package属性填写com.cfan.garychan.nameparser。如果你忘记了package的知识,请参考《Java咖啡馆(6)―编写猜数字游戏 》中关于包概念的描述。

  回顾一下,类是定义了从类生成的实例(instance)中的数据和方法的关系的模板。有人喜欢把类比作图章,图章敲出来的图案便是对象,的确很形象。

  Java中用class关键字来定义类,不过我们用Eclipse来定义更加方便。仍然用Eclipse新建一个叫做Namer的类,记得不要在public static void main(String[] args)前面打勾,确定后Eclipse便生成一个新的Java源文件Namer.java,里面的代码如下:

public class Namer {

}

  这个类非常简单,可惜不能做任何事情。

  1.封装

  面向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。这样做的好处在于可以使类内部的具体实现透明化,只要其他代码不依赖类内部的私房数据,你便可以安心修改这些代码。此外,这样做也是出于安全方面的考虑,如果代表网上支付卡密码的变量随便就可以被访问到,这样的系统谁还敢用呢?

  封装主要依靠对类、数据和方法的访问控制,从语法上讲就是加上private、protected、public等关键词,如果没有关键词修饰则默认为package。它们控制权限如下表所示:

Specifier 类 子类 包 世界
private X
protected X X* X
public X X X X
package X X

  注意上面的X*,父类的protected部分,只有在与父类在同一个包内的子类才能够访问,否则也是不可访问的。

  让我们结合实例理解一下。稍微把Namer类改一下:

public class Namer {
protected String surname; // 姓
protected String firstname; // 名

public String getFirstname() {
return firstname;
}

public String getSurname() {
return surname;
}
}

  这个类有两个String类型的成员变量,surname和firstname,分别用来储存姓和名。这两个成员变量前都有protected修饰词,按照表格,这两个变量仅能够被类本身、子类以及包中其他类操作,而包外的类则无权访问。不过,为了跟包外的代码进行沟通,Namer类提供了getFirstname和getSurname这两个public的方法。从而,对包外的类而言,姓名数据是只读的。
2.继承

  对象是用类来定义的。通过类,你能够充分了解对象的全貌。比如,一说起自行车,你就会联想到自行车是有两个轮子、车把以及脚踏板。

  更进一步,面向对象语言的另一个特点便是允许从一个已有的类定义新的类。比如,山地车、公路赛车和两人三轮车都是自行车。在面向对象语言中,你可以从一个已经有的自行车类定义山地车类、公路赛车类等等。山地车类、公路赛车类都称为自行车类的子类,自行车类是它们的父类,而这种定义关系,便是继承关系。

  子类继承了父类的属性。比如,山地车、公路赛车都是有两个轮子一个车座。子类也可继承了父类的方法,比如山地车、公路赛车、两人三轮车都可以前进、刹车、转弯等。
当然,子类并不限于继承,还可以发扬光大。比如两人三轮车便颠覆了自行车只有两个轮子、一个座垫的属性,使得自己更加休闲潇洒。

  让我们看看如何运用继承来处理名在姓之前的模式。这种模式中,由于姓和名是用空格分割的,所以程序如下:

class FirstFirst extends Namer {
public FirstFirst(String s) {
int i = s.lastIndexOf(" "); // 搜索空格
if (i >0) {
firstname = s.substring(0, i).trim();
surname = s.substring(i + 1).trim();
}
}
}

  FirstFirst类通过extends关键词表示对Namer类进行继承,只有一个类方法,名字恰好是FirstFirst。这并不是一个巧合。

  所有的Java类都拥有若干特殊方法用来初始化对象,它们称为构造函数,特征就是与类同名,可以带有或者没有参数。这种同名函数不同参数的现象,在面向对象中称作重载(Overload)。拿以前使用new操作符生成随机数的代码来说:

Random random = new Random();

  new操作符实例化一个Random对象后,紧接着就调用了Random类的构造函数进行初始化,只不过这个构造函数没有参数。没有参数的构造函数,称为默认构造函数。默认的构造函数是每个类都拥有的,即使没有声明在代码中,Java编译器在编译时也会自动加入。

  回过头来看FirstFirst类。FirstFirst类继承自Namer类,从而也拥有自己的firstname和surname属性。在FirstFirst类的构造函数中,通过解析参数s,通过搜索空格的方法来解析出空格前面的名和空格后面的姓,从而执行

FirstFirst parser = new FirstFirst("Gary Chan");

  之后,我的姓和名已经解析出来并且分别保存在firstname和surname变量中了。同时,FirstFirst类继承了Namer的方法,从而便可以通过如下语句来返回姓――Gary了:

String mySername = parser.getSurname();

  注意,我们并没有在FirstFirst类中定义getSurname()方法,这是从父类继承来的,这就是代码重用的概念,避免了无谓的重复劳动。

  有了上面的基础,再来编写名在姓之后的模式:

class FirstLast extends Namer {
public FirstLast(String s) {
int i = s.indexOf(","); // 搜索逗号
if (i >0) {
surname = s.substring(0,

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java咖啡馆(7)――大话面向对象(.. 下一篇JBuilder2005实现重构之升级到JDK..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目