美文网首页
继承与向上转型

继承与向上转型

作者: Vincent_Jiang | 来源:发表于2017-06-03 14:41 被阅读5次

    前言

    • “为新的类提供方法”并不是继承这一特性中最为重要的方面,其最重要的方面是表现新的类和基类之间的关心
    • tune() 方法接受的是 Instrument 对象的引用,但是在下面的代码中却传入了一个 Wind 类型的引用。
    • Java对类型的检查非常严格,你一定会觉得奇怪。
    • 除非你认识到 Wind 是 Instrument 的导出类,一个方法接受的参数可以是参数本身的类型,也可以是参数本身类型的导出类型。
    • 例如 toString(Object o) 它接受的是一个 object 的类型,那么我们可以传入任意 Java 对象类型作为参数,因为所有的 Java 对象类型都是 object 类型的子类。
    • 这种动作被称为“向上转型”

    基类

    public class Instrument {
        public void play() {
        }
    
        public static void tune(Instrument instrument) {
            instrument.play();
        }
    }
    

    导出类

    public class Wind extends Instrument {
        public static void main(String[] args) {
            Wind wind = new Wind();
            Instrument.tune(wind);
        }
    }
    

    构造方法调用重写方法

    在 new 过程中,首先是初始化父类,父类构造方法调用 description(),description() 被子类重写了,就会调用子类的 description() 方法,子类方法打印 "Cat"。
    像这样,在父类构造方法中调用可被子类重写的方法,是一种不好的实践,容易引起混淆,应该只调用 private 的方法。

    public class Animal {
        public Animal() {
            description();
        }
        public void description() {
            System.out.println("Animal");
        }
    }
    
    public class Cat extends Animal {
        public Cat() {}
        
        @Override
        public void description() {
            System.out.println("Cat");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Cat cat = new Cat();
        }
    }
    
    //output: "Cat"
    

    相关文章

      网友评论

          本文标题:继承与向上转型

          本文链接:https://www.haomeiwen.com/subject/luxmfxtx.html