最新消息:

Java编程中的面向对象之多态(polymorphisn)

Java 36浏览 0评论

    首先要说的是,多态(polymorphisn)这个特性最早是在 C++ 中接触到的,C++ 中的多态是通过虚函数来实现的,虚函数允许子类重新定义成员函数,这种子类重新定义父类成员函数的操作叫做重写(override)。这里就有个问题了,重写(override)分为重写虚函数和重写成员函数,在C++ 中只有重写了虚函数才能算是真正意义上的多态。

    JAVA 中的多态是对象的多态,分为引用多态和方法多态。

    引用多态:

    父类的引用可以指向本类的对象,也可以指向子类的对象。

    方法多态:

    通过在继承类中重写父类成员函数。

    现在很多语言例如PHP,JAVA实现的多态的方法,多数都是通过定义接口,在继承类中重写覆盖父类成员函数,来实现函数的多态性。但这个感觉很虚。

    反过来想其实也是一种思想,比如比较常见的依赖注入,其实也是其中一种扩展思想,目的也都是让代码具有更好的伸缩性。

以“人类有说话的能力”为例,上代码:

创建 Person 类:

package com.wecot.lang;

public class Person {
	public void say()
	{
		System.out.println("人类会说话");
	}
}

创建 Chinese 类继承 Person 类:

package com.wecot.lang;

public class Chinese extends Person {
	public void say()
	{
		System.out.println("中国人说中国话");
	}
}

创建  American 类继承 Person 类:

package com.wecot.lang;

public class American extends Person {
	public void say()
	{
		System.out.println("美国人说美国话");
	}
}

创建测试 Test类 :

package com.wecot.lang;

public class Test {
	public static void main(String[] args) {
		Chinese person1 = new Chinese();
		American person2 = new American();
		person1.say();
		person2.say();
	}
}

以上实现仅仅是使用了Java面向对象中的继承特性。可以对其升级改进:

package com.wecot.lang;

public class Test {
	public static void main(String[] args) {
		Person person1 = new Chinese();
		Person person2 = new American();
		person1.say();
		person2.say();
	}
}

如此修改便是使用到了Java 面向对象中的多态特性——父类的引用指向子类的对象,但是仍然有可以优化改进的余地。仔细观察发现,Test 类中的Person 在创建实例过程中,仅仅起到了制定规则的作用,既然如此,更是应该将其升级为抽象类,更好发挥规则限定的作用,而不作具体的实现。因此,修改Person 类:

package com.wecot.lang;

public abstract class Person {
	public abstract void say();
}

如上的设计方式便是java面向对象中同时发挥继承和多态特性的过程。其实PHP中也是一样,不过总体跟C++ 中的多态还是有很大区别,总感觉PHP和JAVA中的这种多态,仅仅是设计上贴近多态效果,与C++中多态还是相去甚远。文章仅是个人薄见,不对之处欢迎指出讨论。

转载请注明:微刻 blog.wecot.cn » Java编程中的面向对象之多态(polymorphisn)

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址