我在Bruce Eckel撰写的《 Java思维第四版》中进行以下练习:


  练习16:(2)创建一个名为Amphibian的类。从此继承一个名为Frog的类。在基类中放置适当的方法。在main()中,创建Frog并将其向上转换为两栖动物,并演示所有方法仍然有效。


Frog f = new Frog();Amphibian f = new Frog();在以下方面有什么区别:

class Amphibian {
    void go() { System.out.println("go"); }
    void stop() { System.out.println("stop!"); }
}

class Frog extends Amphibian {
    void go() { System.out.println("not go"); }
}

public class EFrog {
    public static void main(String[] args) {
        Frog f = new Frog();
        f.go();
    }
}

最佳答案

但是我不明白Frog f = new Frog();和Frog有什么区别?和两栖动物f = new Frog();


为了理解差异,让我们在Frog中添加另一个不在Amphibian中的方法

class Frog extends Amphibian {
    void go() { System.out.println("not go"); }
    void come() { System.out.println("come"); }
}


现在让我们看一下有什么区别:

public class EFrog {
    public static void main(String[] args) {
        Frog f = new Frog();
        f.go();
        f.come();
        Amphibian a = f;
        a.come();//this won't compile
    }
}


底线。 FrogAmphibian,因此Frog可以执行Amphibian可以执行的任何操作。 Amphibian不是Frog,所以Amphibian不能做Frog可以做的所有事情。

当您说Amphibian a = new Frog()时,您是在编程一个接口(不是java接口,而是接口的一般含义)。当您说Frog f = new Frog()时,您正在编程实现。

现在来看书要求您尝试的实际问题:


  在main()中,创建一个Frog,并将其上传到两栖动物并演示
  所有方法仍然有效。


public class EFrog {
        public static void main(String[] args) {
            Frog f = new Frog();
            Amphibian g = (Amphibian)f;//this is an upcast
            g.go(); //okay since Amphibian can go
            g.come();//not okay since Amphibian can't come
        }
    }


我不认为您要问的是upcasting的用途,但是既然标题已经由其他人编辑过,为什么不回答呢?上载在某些情况下很有用,例如明确调用重载方法的特殊形式。有关其他详细信息,请参见this答案。

关于java - 上载Java中的子类引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30914253/

10-09 00:10