黑马程序员技术交流社区
标题:
多态小问题
[打印本页]
作者:
天涯海角
时间:
2013-8-9 09:35
标题:
多态小问题
多态的出现大大提高代码的扩展性,具体体现是什么
作者:
梦想蓝色天空
时间:
2013-8-9 10:08
1,多态的体现
父类的引用指向自己的子类对象
父类的引用也可以接收自己的子类对象
2,多态的前提
必须是类与类之间有关系,要么继承 要么实现
通常还有一个前提:存在覆盖
所以说继承和实现接口都是多态的体现。。。你可以想一个原先有一个动物类,类中有一个吃的方法。但是你想动物肯定还有跑、走、叫等的方法吧。在不改变原代码的情况下。你自己再写一个类,继承了动物类,也就有个吃的方法,在你定义的类中你可以写跑、走、叫方法。不是对动物类的扩展吗?
作者:
小发
时间:
2013-8-9 10:28
本帖最后由 小发 于 2013-8-9 10:32 编辑
请看下面代码
public abstract class Animal {
public abstract void eat();
public void sleep(){
System.out.println("睡觉");
}
}
复制代码
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("吃鱼");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
复制代码
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("啃骨头");
}
public void kanMen(){
System.out.println("看门");
}
}
复制代码
public class DuoTai {
public static void main(String[] args) {
function(new Cat());
function(new Dog());
}
public static void function(Animal a){//这里利用多态的特性,提高代码的复用,提高了扩展性。
a.eat();
a.sleep();
}
}
//
public class DuoTai 1{
public static void main(String[] args) {
Cat c=new Cat();
c.catchMouse();
c.sleep();
Dog d=new Dog();
d.kanMen();
d.sleep();
//如果不利用多态的特性那么就得一个一个new,一个一个调用,很麻烦。
}
}
复制代码
作者:
付龙
时间:
2013-8-9 11:31
扩展性么,简单就是在原有功能上增加新的功能。
说个例子,很多年前,播放器只有播放、暂停、停止功能。现在的播放器除了以上功能还能截图啊、快进啊等功能。
增加新出现的功能不要把原来代码全部修改掉,那样太烂了,工作量太大。
利用多态,通过继承啊实现啊覆盖什么的,在原代码基础上新增功能。不改原代码,有什么新功能就加上新功能方法,多方便。
作者:
心灵之歌
时间:
2013-8-9 12:00
多态的体现
父类的引用指向自己的子类对象
父类的引用也可以接收自己的子类对象
多态的前提
必须是类与类之间有关系,要么继承 要么实现
通常还有一个前提:存在覆盖
所以说继承和实现接口都是多态的体现。。。你可以想一个原先有一个动物类,类中有一个吃的方法。但是你想动物肯定还有跑、走、叫等的方法吧。在不改变原代码的情况下。你自己再写一个类,继承了动物类,也就有个吃的方法,在你定义的类中你可以写跑、走、叫方法。不是对动物类的扩展吗?
例:
public class Animal {
public void eat(){
}
public void sleep(){
System.out.println("睡觉");
}
}
复制代码
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("吃鱼");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
复制代码
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("啃骨头");
}
public void kanMen(){
System.out.println("看门");
}
}
public class DuoTai {
public static void main(String[] args) {
function(new Cat());
function(new Dog());
}
public static void function(Animal a){//这里接收的是父类,利用多态的特性,提高代码的复用,提高了扩展性。
a.eat();
a.sleep();
}
}
作者:
Mr_Free
时间:
2013-8-9 23:31
给你写个例子,你就知道了
package wenti;
//转型分向上转型 和向下转型;
//写个例子:
class wenti5{
public static void main(String[] args){
Fu erzi = new Zi();//这是你如果要调用儿子的特有的方法,就必须向下转型
Zi er =(Zi)erzi;
er.erziteyou();
// 至于为什么要向上转型是这样的,一般父类是一些大家共有的方法,现在我想让所有子
// 类都做同样父类有的方法,而你每次执行的话创建对象,然后用对象一个一个调用写起来有些麻烦,
// 所以,你可以考虑把父类的方法执行,封装成一个类中的静态方法,在传入参数的时候写父类的参数
// 这样的好处是避免了代码重复。下面我写一个例子
Fu fuDo = (Fu)er;//向上转型。为了调用function方法
Fu nver =new daughter();
function.fufunctionDo(fuDo);//执行父类方法
function.fufunctionDo(nver);//执行父类方法
}
}
class daughter extends Fu{
public void nverteyou(){
System.out.println("这方法女儿特有,爹爹没有");
}
public void showzi(){
System.out.print("showzi");
}
public void chi(){
System.out.println("女儿chi");
}
public void he(){
System.out.println("女儿he");
}
public void shui(){
System.out.println("女儿shui");
}
}
class Fu{
public void chi(){
System.out.println("chi");
}
public void he(){
System.out.println("he");
}
public void shui(){
System.out.println("shui");
}
public void showfu(){
System.out.print("showfu");
}
}
class Zi extends Fu{
public void erziteyou(){
System.out.println("这方法儿子特有,爹爹没有");
}
public void showzi(){
System.out.print("showzi");
}
public void chi(){
System.out.println("zichi");
}
public void he(){
System.out.println("zihe");
}
public void shui(){
System.out.println("zishui");
}
}
class function{
public static void fufunctionDo(Fu fu){
fu.chi();
fu.he();
fu.shui();
}
}
复制代码
作者:
垂天云
时间:
2013-8-10 07:08
简单体现就像人可以睡觉,可以吃饭,还可以打篮球,可以学习JAVA,可以学习.NET,多种形态必然提高扩展性啊!
作者:
王林涛
时间:
2013-8-10 07:39
就单单多态实现了扩展性而言的话:当然是,一个类实现某个接口,或者一个类可以实现多个接口.
例子就不用给了,上面有哥们儿给了,挺经典的一个例子.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2