5。7thisJava有一个特殊的实例值叫this,它用来在一个成员函数内部指向当前的对象。在前面的例子里,我们调用u。init,一?copy;进入init成员函数内部,this就会指向u所指向的对象。在Java里,在同一个范围定义两个相同名字的局部变
量是不可以的。有趣的是,局部变量、成员函数的参数可以和实例变量的名字相同。前面我们没有用name和city作为成员函数init的参数名字,因为这样它们在成员函数的范围里就把实例变量name和city隐藏了,即name指向参数name,隐藏了实例变量name。this让我们可以直接指向对象本身。下面是另一个版本的init,用name和city作为参数名字,用this来接收当前对象的实例变量。
voidinit(Stringname;Stringcity){this。name=name;this。city=city;}下面是带有新的init初始成员函数的TwoUniversity例子。classUniversity{Stringname;city;voidinit(Stringname;Stringcity){this。name=name;this。city=city;}}classTwoUniversityInit{publicstaticvoidmain(Stringargs''){Universityu1=newUniversity();Universityu2=newUniversity();u1。init(”北?copy;大学”;”北?copy;”);u2。init(”清华大学”;”北?copy;”);System。out。println(”大学:”+u1。name+”城市:”+u1。city);system。out。println(”大学:”+u2。name+”城市:”+u2。city);}}
5。8构造函数(Constructor)
每创建一个类的实例都去初始化它的所有变量是乏味的。如果一个对象在被创建时就完成了所有的初始工作,将是简单的和简洁的。因此,Java在类里提?copy了一个特殊的成员函数,叫做构造函数(Constructor?copy;。一个构造函数是对象被创建时初始对象的成员函数。它具有和它所在的类完全一样的名字。一?copy;定义好一个构造函数,创建对象时就会自动调用它。构造函数没有返回类型,即使是void类型也没有。这是因为一个类的构造函数的返回值的类型就是这个类本身。构造函数的任务是初始一个对象的内部状态,所以用new操作符创建一个实例后,立刻就会得到一个清楚、可用的对象。下面这个例子里,用构造函数取代了成员函数init。
classUniversity{Stringname;city;University(Stringname;Stringcity)
{this。name=name;this。city=city;}}classUniversityCreate{publicstaticvoidmain(Stringargs''){Universityu=newUniversity(”北?copy;大学”;”北?copy;”);System。out。println(”大学:”+u。name+”城市:”+u。city);}}new语句中类名后的参数是传给构造函数的。
5。9成员函数重载
对于几个意义相近的成员函数,有时使用相同的名字便于理解。因此,Java语言实现了成员函数重载,即可以创建几个名字相同、参数不同的成员函数。成员函数重载提?copy;了Java的多态行为。下面的例子用到了重载。classUniversity{Stringname;city;University(Stringname;Stringcity){this。name=name;this。city=city;}University(){name=”北?copy;大学”;city=”北?copy;”;}}
classUniversityCreateAlt{publicstaticvoidmain(Stringargs''){Universityu=newUniversity();System。out。println(”大学:”+u。name+”城市:”+u。city);}}
这个例子创建了一个University对象,调用了第二个构造函数。下面是它的运行结果。
C:》javaUniversityCreateAlt大学:北?copy;大学城市:北?copy;一个构造函数可以调用另一个构造函数来创建实例。例如:
classUniversity{Stringname;city;University(Stringname;Stringcity)
{this。name=name;this。city=city;}University(){this(”北?copy;大学”;”北?copy;”);}}
第二个构造函数调用了第一个构造函数来完成实例的初始化。你也可以用重载来创建一般的成员函数。下面这个例子里有University类的两个版本的samecity成员函数。samecity判断一个大学是否在一个城市里或一个大学和另一个大学是否在同一个城市里。一个成员函数用city作参数,另一个用University对象作参数。
classUniversity{Stringname;city;University(Stringname;Stringcity)
{this。name=name;this。city=city;}booleansamecity(Stringcity){if
(city。equals(this。city))returntrue;elsereturnfalse;}boolean
samecity(Universityu){returnsamecity(u。city);}}
classUniversityCity{publicstaticvoidmain(Stringargs''){String
city=”上海”;Universityu1=newUniversity(”北?copy;大学”;”
北?copy;”);Universityu2=newUniversity(”清华大学”;”北?copy;”);
System。out。println(”u1=”+u1。name+”;”+u1。city);
System。out。println(”u2=”+u2。name+”;”+u2。city);
System。out。println(”city=”+city);
System。out。println(”u1。samecity(u2)=”+u1。samecity(u2));
System。out。println(”u1。samecity(city)=”+u1。samecity(city));}}
下面是该程序的运行结果。
C:》javaUniversityCityu1=北?copy;大学;北?copy;u2=清华大学;北?copy;city=上海u1。samecity(u2)=trueu1。samecity(city)=false
5。10继承
第二个基本的面向对象机制是继承。继承是关于有层次关系的类?reg;间的概念。一个类的后代可以继承它的祖先的所有变量和成员函数,就象创建自己的一样。一个类的直接父亲叫做它的超类(superclass?copy;。一?copy;你创建了一个象University这样的类,创建它的子类是很简单的。一个类的子类是它的继承了实例变量和成员函数的特殊的版本。在这个例子里,我们把University类派生为含有叫做country的第三个元素的子类。
classUniversityWorldextendsUniversity{Stringcountry;UniversityWorld(Stringname;Stringcity;Stringcountry){this。name=name;this。city=city;this。country=country;}UniversityWorld(){this(”北?copy;大学”;”北?copy;”;”中国”);}}
关键词extends用来表示我们要创建University的子类。name和city不需再在UniversityWorld中进行声明,因为它们是从University中继承的。Java允许?
请勿开启浏览器阅读模式,否则将导致章节内容缺失及无法阅读下一章。
相邻推荐:元宝传奇 史上最拽的十个女人 游神传说之界王 穿越之正妻诱惑 02.25完结+1番外 东北谜踪 鬼夜 节妇的悠然生活 娘亲V5父皇很欠抽 侠 魅魔模拟器 产生物 荒界实录 黄帝内经实用手册 天空大陆 众语皆悲 闲巫在都市 要说多少次,我不是人奸! 洪荒老祖已无敌 道君且慢 上古卷轴天际之子