黑马程序员技术交流社区

标题: 一个多态的问题 [打印本页]

作者: 冯旭君    时间: 2012-3-12 09:30
标题: 一个多态的问题
//father.function2();(虽然静态方法不推荐这样调用)调用的问什么是父类的方法?

public class AbstractClassTest {
       
        public static void main(String[] args) {
               
                AbstractFather father = new TheSub();
               
                father.function1();
               
                AbstractFather.function2();
                TheSub.function2();
               
                father.function2();//为什么不调用子类的方法???
               
                father.function3();//调用的是子类的方法
               
               
               
        }
       
       

}


abstract class AbstractFather{
       
        public abstract void function1();
       
        public static void function2(){
               
                System.out.println("hello function()2 of theFather");
               
        }
       
        public void function3(){
                System.out.println("hello funcion()3 of theFather");
        }
       
}

class TheSub extends AbstractFather{

        @Override
        public void function1() {
                // TODO Auto-generated method stub
               
                System.out.println("hello funciont1 of TheSub");
               
        }
       
        public static void function2(){
               
                System.out.println("hello function2 of TheSub");
               
        }
       
        public void function3(){
                System.out.println("hello funcion()3 of TheSub");
        }
       
}
作者: 张希强    时间: 2012-3-12 09:57
由于AbstractFather的function2()是static的,而静态方法是类的方法,不是类的实例的方法,不能被导出类覆盖。
作者: 泮和顺    时间: 2012-3-12 10:27
father.function1();//父类抽象方法没方法体:父类没方法体必须子类复写才能调用
               
                AbstractFather.function2();//静态的父类方法
                TheSub.function2();        //子类静态方法
               
                father.function2();//为什么不调用子类的方法???、//因为是静态的:”静态“是指能被类调用,
               
                father.function3();//调用的是子类的方法   //普通的复写父类方法
作者: 王睿    时间: 2012-3-12 10:44
父类function2是静态方法,直接用类名就可以调用,静态后就不会被复写了。
作者: 冯旭君    时间: 2012-3-12 11:07
王睿 发表于 2012-3-12 10:44
父类function2是静态方法,直接用类名就可以调用,静态后就不会被复写了。

嗯,我是故意让引用调用的。静态方法是不能被重写的。只有非静态的方法才能够被重写。
作者: 赵英坤    时间: 2012-3-12 11:08
package Diversify;
//关于多态,多方求解之后方得到正确答案
import static Test_purview.print.*;
import Test_initalized.neum;

public class Test_diversifyTest1 {
        public static void main(String[] args){
                Cycle c = new Cycle();
                c.ride1();
                print(" 车轮数:"+c.ride(neum.Bicycle).wh);
                Unicycle c1 = new Unicycle();
                c1.ride1();
                print(" 车轮数:"+((Unicycle)c1.ride(neum.Unicycle)).wh);
                print(" 车轮数:"+((Unicycle)c1.ride(neum.Unicycle)).wh1);
//                依然有疑问,按照程序的执行来看得到的返回类型是Cycle,但是为什么是Cycle还是不是很了解,但是正确的做法就是这样
//                把返回的Cycle类型强制转换成Unicycle类型就能得到正确的wh了
//                向下面这样子会得到的结果是0而不是4,因为遵循就近原则,哪儿近就得到哪儿的
//                print(" 车轮数:"+c1.ride(neum.Unicycle).wh);
        }
}
class Cycle{
         int wh = 0;
         public void ride1(){
                 System.out.println("This Is Class Cycle111111111111111111111111");
         }
        public Cycle(){
                print("This is in The class Cycle!");
        }
        public Cycle ride(Object o){
                print("Class: "+ this);
                return this;
        }
}

class Unicycle extends Cycle{
         int wh1 = 4;
         public void ride1(){
                 System.out.println("This Is Class Unicycle22222222222222222222222222");
         }
        public Unicycle(){
                print("This is in The class Unicycle!");
        }
        public Unicycle ride(Unicycle o){
                print("Class: "+ this);
                return this;
        }
}
class Bicycle extends Cycle{
        int wh = 2;
        static void ride(){
                 System.out.print("This Is Class Bicycle");
         }
        public Bicycle(){
                print("This is in The class Bicycle!");
        }
}
class Tricycle extends Cycle{
        int wh = 3;
        public Tricycle(){
                print("This is in The Tricycle!");
        }
}

//Output:
//This is in The class Cycle!
//This Is Class Cycle111111111111111111111111
//Class: Diversify.Cycle@61de33
// 车轮数:0
//This is in The class Cycle!
//This is in The class Unicycle!
//This Is Class Unicycle22222222222222222222222222
//Class: Diversify.Unicycle@ca0b6
// 车轮数:0
//Class: Diversify.Unicycle@ca0b6
// 车轮数:4




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2