这个是最基础的多态了enum Noto{ MIDOLE_C,C_SHARP,B_FLAT; }class Instrument{ public void play(Noto n){ System.out.println("Instrumen.play()"); } }class Wind extends Instrument{ public void play(Noto n){ println("Wind.play()"+n); } }public class Music{ public static void tune(Instrument i){ i.play(Noto.MIDOLE_C); } public static void main(String[] args){ Wind flute = new Wind(); tune(flute); } }
楼上都是经典。 一、基本概念: ① 静态多态性(编译时的特性),Java中的静态多态性实现手段-----重载函数。其调用规则是依据对象在定义时的类型相应地调用对应类中的重载函数 ② 动态多态性(运行时的特性),Java中的动态多态性实现手段---覆盖(替换)基类中的同名成员函数(函数原型一致)。 其调用规则是依据对象在实例化时而非定义时的类型相应地调用对应类中的同名成员函数。 ③ 父类与子类对象编程规则(赋值兼容原则):子类的对象可当着父类的对象来使用。 public class Door{ public void openDoor() { ......... } } public class SubDoor extends Door{ public void openDoor(Alarm alarm) { 。 } }
实现多态首先满中三个条件: 1、要有继承 2、要有方法重写 3、要有父类引用指向子类对象举个例子:class Base { public void print(){ System.out.println("调用的是父类print方法"); } }class Sub extends Base{//要有继承 public void print(){ System.out.println("调用的是子类的print方法");//重写print方法 } public void pay(){ System.out.println("111111111111111111"); } }class Test{ public static void main(String args[]){ Base base = new Sub();//父类引用指向子类对象 base.print(); }这样最后输出的结果是:调用的是子类的print方法此外,每生成一个对象,这个对象本身都会有自己的一个方法表,当有继承关系时,子类对象的方法表中还会继承父类的方法,大对象的方法表中有一个偏移量指针,通过这个指针可以调用到方法。如果一个方法在子类中被重写,则这个指针被改写成子类重写的方法的指针。Base对象方法表 ----- ------------ ----- ---------------- 1 toString() 1 toString() . . . ------ ------------- ------ ------------------ 5 print() 10 print() 如果print()方法被重写,则偏移量指针被改写成子类的,没被重写的话,偏移量指针不会改变, 所以当被重写的时候,调用的是子类的方法,没被重写调用的是父类的方法表达能力有限,不知道说明白没有~!
楼主【etgqqw】截止到2008-07-21 16:47:52的历史汇总数据(不包括此帖):
发帖的总数量:1 发帖的总分数:20 每贴平均分数:20
回帖的总数量:2 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:1 结贴的总分数:20
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
private String name;
Animal(String name) {
this.name=name;
}
public void enjoy(){
System.out.println("叫声...");
}
}class Cat extends Animal {
private String eyesColor;
Cat(String n,String c) {
super(n);
eyesColor = c ;
}
public void enjoy() {
System.out.println("猫叫...");
}
}class Dog extends Animal {
private String furColor;
Dog(String n,String c) {
super(n);
furColor = c;
}
public void enjoy() {
System.out.println("狗叫...");
}
}class Lady {
private String name;
private Animal pet;
Lady(String name,Animal pet) {
this.name = name;
this.pet = pet;
}
public void myPetEnjoy() {
pet.enjoy();//只有运行的时候,才知道调用的是哪个动物的 'enjoy()' 方法
}
}
public class Test {
public static void main(String args[]) {
Cat c = new Cat("mimi","blue");
Dog d = new Dog("didi","black");
Lady l1 = new Lady("mary",c);
Lady l2 = new Lady("linda",d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}
http://topic.csdn.net/u/20080721/16/b9972587-259c-49fc-ad48-759810de9ac7.html
MIDOLE_C,C_SHARP,B_FLAT;
}class Instrument{
public void play(Noto n){
System.out.println("Instrumen.play()");
}
}class Wind extends Instrument{
public void play(Noto n){
println("Wind.play()"+n);
}
}public class Music{
public static void tune(Instrument i){
i.play(Noto.MIDOLE_C);
}
public static void main(String[] args){
Wind flute = new Wind();
tune(flute);
}
}
一、基本概念:
① 静态多态性(编译时的特性),Java中的静态多态性实现手段-----重载函数。其调用规则是依据对象在定义时的类型相应地调用对应类中的重载函数
② 动态多态性(运行时的特性),Java中的动态多态性实现手段---覆盖(替换)基类中的同名成员函数(函数原型一致)。 其调用规则是依据对象在实例化时而非定义时的类型相应地调用对应类中的同名成员函数。
③ 父类与子类对象编程规则(赋值兼容原则):子类的对象可当着父类的对象来使用。 public class Door{ public void openDoor()
{
.........
} } public class SubDoor extends Door{
public void openDoor(Alarm alarm)
{
。
} }
1、要有继承
2、要有方法重写
3、要有父类引用指向子类对象举个例子:class Base {
public void print(){
System.out.println("调用的是父类print方法");
}
}class Sub extends Base{//要有继承
public void print(){
System.out.println("调用的是子类的print方法");//重写print方法
}
public void pay(){
System.out.println("111111111111111111");
}
}class Test{
public static void main(String args[]){
Base base = new Sub();//父类引用指向子类对象
base.print();
}这样最后输出的结果是:调用的是子类的print方法此外,每生成一个对象,这个对象本身都会有自己的一个方法表,当有继承关系时,子类对象的方法表中还会继承父类的方法,大对象的方法表中有一个偏移量指针,通过这个指针可以调用到方法。如果一个方法在子类中被重写,则这个指针被改写成子类重写的方法的指针。Base对象方法表
----- ------------ ----- ----------------
1 toString() 1 toString()
.
.
.
------ ------------- ------ ------------------
5 print() 10 print()
如果print()方法被重写,则偏移量指针被改写成子类的,没被重写的话,偏移量指针不会改变,
所以当被重写的时候,调用的是子类的方法,没被重写调用的是父类的方法表达能力有限,不知道说明白没有~!