请教!

jsjwql 2003-08-17 11:45:04
深入多态性

Java使用动态绑定来使多态成为可能,它指的是Java用来在运行时选择调用的方法或对象的机制.重载构成了了Java中的一种特殊的多态机制,它表现在当一个类的两个或者两个以上的方法拥有相同的名字但是不同的参数列表,或者说"方法签名".一个方法的签名指的是方法的名字以及参数的类型和数目.类的每一个方法都有与之相关的唯一的签名.类可以有多个名字相同的方法只要它们的参数列表是唯一的.例如,我们能够为Animal类定义两个名字为getHello的方法,用其中一个方法来获得动物通常的叫声,而用另一个获得当动物被惊吓或是抚摩的时候的叫声.我们将给每一个方法唯一的签名:



public String getHello();

public String getHello(int mood);





现在,让我们修改例子程序来将我们讨论的一些概念付诸实践:

 



public class HelloWorld

{

public static void main(String[] args)

{

Dog animal1 = new Dog();

Cat animal2 = new Cat();

Duck animal3 = new Duck();



System.out.println("A dog says " +animal1.getHello()

+", when scared says: " +animal1.getHello(Animal.SCARED)

+", is carnivorous: " +animal1.isCarnivorous()

+", is a mammal: " +animal1.isAMammal());

System.out.println("A cat says " +animal2.getHello()

+", when comforted says: " +animal2.getHello(Animal.COMFORTED)

+", is carnivorous: " +animal2.isCarnivorous()

+", is a mammal: " +animal2.isAMammal());

System.out.println("A duck says " +animal3.getHello()

+", when scared says: " +animal3.getHello(Animal.SCARED)

+", is carnivorous: " +animal3.isCarnivorous()

+", is a mammal: " +animal3.isAMammal());

}

}



abstract class Animal

{

public static final int SCARED = 1;

public static final int COMFORTED = 2;



public boolean isAMammal()

{

return(true);

}



public boolean isCarnivorous()

{

return(true);

}



abstract public String getHello();

abstract public String getHello(int mood);

}



interface LandAnimal

{

public int getNumberOfLegs();

public boolean hasATail();

}



interface WaterAnimal

{

public boolean hasGills();

public boolean laysEggs();

}



class Dog extends Animal implements LandAnimal

{

// 重载父类的方法

public String getHello()

{

return("Bark");

}



public String getHello(int mood)

{

switch (mood) {

case SCARED:

return("Growl");

case COMFORTED:

return("");

}



return("Bark");

}



// LandAnimal 接口的实现

public int getNumberOfLegs()

{

return(4);

}



public boolean hasATail()

{

return(true);

}

}



class Cat extends Animal implements LandAnimal

{

// 重载父类的方法

public String getHello()

{

return("Meow");

}



public String getHello(int mood)

{

switch (mood) {

case SCARED:

return("Hiss");

case COMFORTED:

return("Purr");

}



return("Meow");

}



// LandAnimal 接口实现

public int getNumberOfLegs()

{

return(4);

}



public boolean hasATail()

{

return(true);

}

}



class Duck extends Animal implements LandAnimal, WaterAnimal

{

// 重载父类的方法

public String getHello()

{

return("Quack");

}



public String getHello(int mood)

{

switch (mood) {

case SCARED:

return("Quack, Quack, Quack");

case COMFORTED:

return("");

}



return("Quack");

}



public boolean isAMammal()

{

return(false);

}



public boolean isCarnivorous()

{

return(false);

}



// WaterAnimal 接口实现

public boolean hasGills()

{

return(false);

}



public boolean laysEggs()

{

return(true);

}



// LandAnimal 接口实现

public int getNumberOfLegs()

{

return(2);

}



public boolean hasATail()

{

return(false);

}

}



程序执行后输出的结果如下:



A dog says Bark, when scared says: Growl, is carnivorous:
true, is a mammal: true

A cat says Meow, when comforted says: Purr, is carnivorous:
true, is a mammal: true

A duck says Quack, when scared says: Quack, Quack, Quack,
is carnivorous: false, is a mammal: false



我感觉好想接口在这里没什么用啊!
...全文
49 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjwql 2003-08-18
  • 打赏
  • 举报
回复
yuebenxian(我是谁) 兄
你不认为在这里接口没有起到使类具有多重继承吗?如果有怎么继承的!
我到认为如果把这里面的关于接口方面的代码给删除了不会影响结果的,你认为呢?
yuebenxian 2003-08-18
  • 打赏
  • 举报
回复
恩.这里没有起到作用.
删除当然不可以.因为有类implemnet它了...可以换一种方式实现.
return(4);return(2);我认为没有什么?(我认为!)...研究.或许就是一种返回的值不一样,根据这个值来判断是哪个的返回,,就这个作用.
yuebenxian 2003-08-17
  • 打赏
  • 举报
回复
你需要什么流程.....
我觉得你应该先看一本书..系统的看......
如何??真的.这个问题书上都有...
jsjwql 2003-08-17
  • 打赏
  • 举报
回复
能不能就在个例题
把他的流程原理跟我讲讲吗?
NewStarter 2003-08-17
  • 打赏
  • 举报
回复
在java里面多重继承要靠接口实现
yuebenxian 2003-08-17
  • 打赏
  • 举报
回复
你看过C++的书没有...作用一样...但是实现方式不一样...
yuebenxian 2003-08-17
  • 打赏
  • 举报
回复
不是...接口作用是去掉了c++中的多重继承...就是说.你可以定义一个大家都用的东东作为接口,然后大家用.....这个时候相当于多重继承...
jsjwql 2003-08-17
  • 打赏
  • 举报
回复
请兄弟们指教!!
jsjwql 2003-08-17
  • 打赏
  • 举报
回复
return(4);

return(2);

是干什么的?

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧