zzjjxxzzjjxx
数码蛋
2017-03-29 07:36
采纳率: 20%
浏览 3.4k
已采纳

java多态中怎么理解父类可以自动接收子类实例化对象

刚刚看视频里面提到的一句话“父类可以自动接收子类实例化对象”,这句话怎么理解求大神解释

class A {
    public void fun() {
        System.out.println("A public void fun()");
    }
}

class B extends A {
    public void fun() { // 核心方法
        System.out.println("B public void fun()");
    }

    // 是子类扩充的方法
    public void printB() { // 非核心方法
        System.out.println("B public void printB()");
    }
}

class C extends A {
    public void fun() {
        System.out.println("C public void fun()");
    }
}

public class TestDemo {
    public static void main(String args[]) {
        get(new B());
        get(new C());
    }
    public static void get(A a){
        a.fun();
    }
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • auerjds
    auerjds 2017-03-29 08:12
    已采纳

    ”父类可以自动接收子类实例化对象“这句话就是指父类可以接受子类对象。理解层面:猫、狗都属于动物,Animal a = new Dog();
    你贴出来的代码,B中的fun方法是对父类A中的fun方法进行的覆盖重写,printB()方法是B类中特有的方法。你的TestDemo中get(new B())和get(new C());
    打印的结果是:
    B public void fun()
    C public void fun()
    为了更好的理解,可以将TestDemo中的代码修改一下:
    A a1 = new B(); // a1 父类自动接收了子类的实例化对象。
    a1.fun();
    A a2 = new C(); //a2 父类自动接受了子类的实例化对象。
    a2.fun();
    打印的结果与上面一致。
    a1.printB();
    打印结果是:B public void printB()

    点赞 评论
  • txl690956710
    txl690956710 2017-03-29 08:01

    很简单啊,比如说一个方法,它的参数是需要一个 输出流 OutputStream ,那么输出流的任何子类都可以当做参数传递进去。

    因为你不管是使用继承还是实现 都会拥有父类定义好的公有方法及其他特性。方法内部是不需要管你到底是个什么输出流。
    只要是输出流就都会拥有OutputStream 的方法或特性,而方法内部也只能调用OutputStream的方法或特性。
    所以这里就体现出了面向接口编程的优势,只要定义好接口,可以动态传递进去不同的子类,不同的实现去应对不同的需求

    点赞 评论
  • ycxjeremy
    ycxjeremy 2017-03-29 08:07

    这个就是继承的使用,假设动物分为A肉食动物,B食草动物,但这些动物又拥有C所有动物的共同特征,A就继承了C,B也继承了C,但是A和B又个子拥有各自的特性

    点赞 评论
  • sinat_36339134
    HessianTes 2017-03-29 08:50

    就是父类可以调用子类的对象来创建子类的实例。B是A的子类,如果要产生B的对象,可以
    B x =new B;
    也可以A x = new B;
    不同的行为,相同的实现 ,可以去看看工厂模式,这个东西就用得很多

    点赞 评论
  • aa649471699
    缺舟丶一帆渡 2017-03-29 09:05
    点赞 评论

相关推荐