A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 赵太云 于 2013-1-12 22:25 编辑

      第一个问题:
            为什么,在java中要这样设计多态的实现呢?           
                      1,非静态的成员函数在多态调用时,编译看左边,运行看右边。
                      2,静态的成员函数在多态调用时,无论编译还运行,都看左边。
                      3,成员变量无编译和运行都看左边。
    第二问题:
          为什么,在java中抽象方法不能是静态的?
                    比如:abstract  static void function();

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

8 个回复

倒序浏览
一、运行时多态:
在运行期间判断引用对象的实际类型,根据实际类型调用相应的方法。
使用多态可以有很好的扩展性,如下代码:
public class Polymorphism {
        public static void main(String[] args) {
                Animal c = new Cat();
                c.eat();
                Animal d = new Dog();
                d.eat();
        }
}

class Animal {
        public void eat() {
                System.out.println("动物吃饭。。。");
        }
}

class Cat extends Animal {
        public void eat() {
                System.out.println("小猫温柔的吃饭。。。");
        }
}

class Dog extends Animal {
        public void eat() {
                System.out.println("小狗疯狂的吃饭。。。");
        }
}
在以上代码中,你可以让Bird继承Animal,这只是一个小例子,
很多地方都会用到多态的概念,这个概念非常重要,一定要掌握。
二、抽象方法只能存在于抽象类中,而且只能用public、protected修饰。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
我来回答你第二个问题吧
如果抽象方法可以定义为静态的
那么abstract class A{
           abstract static void pri();
     }
     class B extends A {
        static void pri();
     }
   class Test {
     public static void main(String[] args){
       A a= new B();
       a.pri();//这里调用的是A的pri();
    }
  }

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
第一个问题,如果一个父类有多个子类,调用这些子类里面的成员,就要创建N多个对象,很麻烦。但是有了多态以后,就极大的简化了代码。而且匿名内部类也要用到多态。
第二个问题,抽象方法也是方法,是可以被static修饰的。但是,抽象方法没有方法体,调用这个静态抽象方法有什么意义呢?
所以说,抽象方法不能被static修饰(接口也是这样)。
以上只是本人理解,非官方解释。{:soso_e113:}
回复 使用道具 举报
修心者 发表于 2013-1-12 20:04
一、运行时多态:
在运行期间判断引用对象的实际类型,根据实际类型调用相应的方法。
使用多态可以有很好的 ...

例子中好像只有:小狗和小猫。。。。。怎么多了个鸟?????????
回复 使用道具 举报
李阳 发表于 2013-1-12 21:14
第一个问题,如果一个父类有多个子类,调用这些子类里面的成员,就要创建N多个对象,很麻烦。但是有了多态 ...

李刚同学的解释果然很好!冯大美女给点技术吧!!呵呵。。。。。。。。谢了。。。。。。
回复 使用道具 举报
赵太云 发表于 2013-1-12 22:13
例子中好像只有:小狗和小猫。。。。。怎么多了个鸟????????? ...

呵呵,假如说,你有一个类Bird类(属于Animal),同样具有eat()方法。则可以重写自己方法而不使用父类中的eat()方法。当你在main中创建Animal b = new Bird();会根据实际对象调用相应方法。如果想用其实子类对象,直接在new就行了,
多态的必要条件:
1,有重写
2,有继承
3,父类引用指向子类对象
你可以看一下多态和动态代理的视频,里面讲的特详细。
回复 使用道具 举报
修心者 发表于 2013-1-12 22:33
呵呵,假如说,你有一个类Bird类(属于Animal),同样具有eat()方法。则可以重写自己方法而不使用父类中的 ...

呵呵,谢了。。。。。。。。。。。。
回复 使用道具 举报
赵太云 发表于 2013-1-12 22:44
呵呵,谢了。。。。。。。。。。。。

不用客气,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马