黑马程序员技术交流社区

标题: 关于继承的一个小问题 [打印本页]

作者: 403383221    时间: 2012-11-14 19:00
标题: 关于继承的一个小问题
父类的对象怎样调用子类的方法?

作者: 刘子义    时间: 2012-11-14 19:08
父类的对象用子类去实现
Father f = new Son();
f可以调用Son中重写过的父类的方法
作者: 张学永    时间: 2012-11-14 19:11
父类的对象是不能调用子类的方法的。而父类的引用指向了子类的对象,那么就可以调用重写过的父类的方法了。
多态中成员函数特点:Fu f = newZi();编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,没有则编译失败。简单总结就是编译看左,运行看右。成员变量的 特点:无论编译和运行,都参考左边(引用型变量所属的类),静态成员函数的特点:无论编译和运行,都参考左边。
作者: 刘菲    时间: 2012-11-14 19:40
1.因为是先有的父类再有的子类,所以父类并不知道子类中有什么方法,所以父类不会去调用子类方法。
2.如果父类中想要用和子类一样的方法那么可以将此方法进行单独封装,再由父类进行调用。以提高代码的复用性。
3.以上只是我个人的理解,有不正确的地方还请指出,希望我们共同学习共同进步。
作者: 王玮    时间: 2012-11-14 20:01
本帖最后由 iacky2 于 2012-11-14 20:17 编辑

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



作者: 张综    时间: 2012-11-14 20:02
这时候父类需要向下转型。转成子类类型。也就是我们说的父类引用指向子类对象。这个过程中也就会有我们平常的所说的多态产生。但是在调用子类方法的过程中必必须调用父类有的这个方法,也就是说调用的是子类重写的父类的方法。这也就是我们平常说的调用的对象受到引用类型的限制。
给你举个例子吧。
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();
       }
}
作者: 王阳    时间: 2012-11-14 20:05
这个应该这么说吧,不能说父类对象引用调用的子类方法,只能说是调用了子类重写了父类的方法。如果是父类中没有的那么当然不能调用,就好比说,你是你父亲的儿子,你的姓继承自你父亲,但是你的名字是自己的,不属于从父亲那继承的了。。我猜想你说的是另一种情况吧,就是多态。
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
补充下,上面说的那个另一个情况多态,忘删除了.....希望没有误导楼主。。。。
作者: 赵保磊    时间: 2012-11-14 20:13
调用不了,必须是子类的对象调用父类的方法。写一个多态:  fuLei   zi=new  ziLei();
                                                                            zi.fanfa(); //这个方法是父类中的
                                                ziLei  a=(zilei)zi;这样转换后才能调用子类中的方法
                                                     a.zifangfa();//这个方法是子类的方法。
而如果子类中也有一个父类中的方法,即如果对父类的方法进行了重写,可以直接zi.fangfa();而如果是子类所特有的方法想调用的话就必须转换。
作者: 张钧杰    时间: 2012-11-14 20:43
父类对象不能调用子类的方法,这是多态的表现,可以说,父类的引用指向子类实例对象, father f  =new son();前提是,class son extends father,
并且,这个引用受父类影响,子类并须重写父类的方法,才能调用,执行是子类重写的方法。




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