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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 403383221 中级黑马   /  2012-11-14 19:00  /  1403 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

父类的对象怎样调用子类的方法?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 鼓励一下 。

查看全部评分

9 个回复

倒序浏览
父类的对象用子类去实现
Father f = new Son();
f可以调用Son中重写过的父类的方法

点评

回答的不够准确 ,父类的对象指向了子类的引用。  发表于 2012-11-14 20:16
回复 使用道具 举报
父类的对象是不能调用子类的方法的。而父类的引用指向了子类的对象,那么就可以调用重写过的父类的方法了。
多态中成员函数特点:Fu f = newZi();编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,没有则编译失败。简单总结就是编译看左,运行看右。成员变量的 特点:无论编译和运行,都参考左边(引用型变量所属的类),静态成员函数的特点:无论编译和运行,都参考左边。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.因为是先有的父类再有的子类,所以父类并不知道子类中有什么方法,所以父类不会去调用子类方法。
2.如果父类中想要用和子类一样的方法那么可以将此方法进行单独封装,再由父类进行调用。以提高代码的复用性。
3.以上只是我个人的理解,有不正确的地方还请指出,希望我们共同学习共同进步。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 iacky2 于 2012-11-14 20:17 编辑

张学友同学,已经把多态编译及运行时期的原则说的很详细了。我再多说两句吧,编译时期吧 就看它 你调用的方法在不在那个类中;而在运行时期,其实是虚拟机的“动态绑定”在起作用,即在多态的情况下,虚拟机可以找到所运行对象的真正类型。注意:动态绑定针对的只是对象的方法。属性还是父类的。
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性 还是父类的属性。
而静态成员函数也是静态绑定的。


评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这时候父类需要向下转型。转成子类类型。也就是我们说的父类引用指向子类对象。这个过程中也就会有我们平常的所说的多态产生。但是在调用子类方法的过程中必必须调用父类有的这个方法,也就是说调用的是子类重写的父类的方法。这也就是我们平常说的调用的对象受到引用类型的限制。
给你举个例子吧。
class A {
    public void fun();
}

class B extends A{
    public void fun(){
    System.out.println("这是重写的父类的方法。父类的fun()方法里什么都没写。这里简单的写了个输出语句。你也可以重写你要用的方法,然后调用。")
    }
}

class MainApp{
       public static void main(String[] args){
                 A a=new B();
                 a.fun();
       }
}

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王阳 中级黑马 2012-11-14 20:05:44
7#
这个应该这么说吧,不能说父类对象引用调用的子类方法,只能说是调用了子类重写了父类的方法。如果是父类中没有的那么当然不能调用,就好比说,你是你父亲的儿子,你的姓继承自你父亲,但是你的名字是自己的,不属于从父亲那继承的了。。我猜想你说的是另一种情况吧,就是多态。
public Person{
    public void name(){
      System.out.println("这是父类的方法!!");
   }
}
public Son extends Person{
    @Override
    public void name(){
      System.out.println("这是子类复写父类的方法!!!");
    }
    public void show(){
    System.out.println("这是子类自己的方法!!");
   }

public class Test{
        public static void main(String[] args) throws IOException {
               Person p = new Son();
               p.name();
        }
}
这里虽然是父类引用指向子类的实例对象,但是只能调用父类中有的方法,不过因为子类中复写了此方法,所以此处应输出为 "这是子类复写父类的方法!!!"
而根本调用不到子类的show()方法;
回复 使用道具 举报
王阳 中级黑马 2012-11-14 20:06:18
8#
补充下,上面说的那个另一个情况多态,忘删除了.....希望没有误导楼主。。。。
回复 使用道具 举报
调用不了,必须是子类的对象调用父类的方法。写一个多态:  fuLei   zi=new  ziLei();
                                                                            zi.fanfa(); //这个方法是父类中的
                                                ziLei  a=(zilei)zi;这样转换后才能调用子类中的方法
                                                     a.zifangfa();//这个方法是子类的方法。
而如果子类中也有一个父类中的方法,即如果对父类的方法进行了重写,可以直接zi.fangfa();而如果是子类所特有的方法想调用的话就必须转换。
回复 使用道具 举报
父类对象不能调用子类的方法,这是多态的表现,可以说,父类的引用指向子类实例对象, father f  =new son();前提是,class son extends father,
并且,这个引用受父类影响,子类并须重写父类的方法,才能调用,执行是子类重写的方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马