面向对象——上转型(二)

u父类声明,子类实例化的对象称为上转型对象。

u1.上转对象不能操作子类新增的成员变量,失掉了这部分属性,不能使用子类新增的方法,失掉了一些功能。

u2.上转型对象可以操作子类继承的成员变量,也可以使用子类继承的或重写的方法。

u3.如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。因为程序在运行时知道,这个上转对象的实例是子类创建的,只不过损失了一些功能而已。

u1.可以将上转型对象再强制转换为一个子类对象,此时对象又具备了子类所有属性和功能(即将上转型对象还原为子类对象)。

扫描二维码关注公众号,回复: 3686203 查看本文章

u2.不可以将父类创建的对象赋值给子类声明的对象。

ufinal关键字可以用来修饰类、方法和变量。

1.final修饰的类不能被继承。

2.final修饰的方法不能被重写。

3.final修饰的变量是常量,不能修改其值。

abstract class Parent {
    abstract void grow();
}

class Son extends Parent {
    void grow() {
        System.out.println("我比父亲成长条件好");
    }

    void play() {
        System.out.println("我会踢球");
    }
}

public class Human {
    public static void main(String[] args) {
        //上转型,用父类的引用子类的对象
        Parent p = new Son();
        //调用父类中有的方法
        p.grow();
        //p.play();这里会报错,因为父类中没有play()方法

        //对进行过上转型的对象,进行强制下转型
        Son s = (Son) p;
        //调用子类中的方法
        s.play();
    }
}
abstract class Parent {
    abstract void grow();
}

class Son extends Parent {
    void grow() {
        System.out.println("我比父亲成长条件好一点:son");
    }

    void play() {
        System.out.println("我会踢球");
    }
}

class Daughter extends Parent {
    void grow() {
        System.out.println("我比父亲成长条件好很多:daughter");
    }

    void dance() {
        System.out.println("我会跳舞");
    }
}

public class Human {
    public static void main(String[] args) {
        Parent p = new Son();
        show(p);
        Parent p2 = new Daughter();
        show(p2);
    }

    public static void show(Parent p) {
        //现将父类中有的方法输出
        p.grow();
        //对进行过上转型的对象进行类型判断,然后进行相应的强制下转型
        if (p instanceof Son) {
            //判断是哪个类的上转型对象,然后进行下转型
            Son s = (Son) p;
            //调用子类中的方法
            s.play();
        } else if (p instanceof Daughter) {
            Daughter d = (Daughter) p;
            d.dance();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41577923/article/details/82981089