java之向上造型之后,调用方法的规则

最近做了几道java题,发现自己对向上造型后调用方法这里有点迷所以做了一些总结。
首先说一下向上造型的格式:
父类 父类对象=子类实例;(自动转换)

向上造型之后,调用方法的规则:

首先哪个类型的引用,它点的只能是他里面出现过的方法名字,子类新加的方法名,父类引用是不能点出这个方法的。其次若子类重写了某个方法,父类点这个方法时父类的方法会被覆盖,调出的是子类重写的方法!重写是虚拟机运行期执行, 根据对象的不同而不是引用类型的不同,去调用不同的版本。
下面是几个例题:

class A {
    static {
        System.out.print("A");
    }
    public A() {
        System.out.print("a");
    }
    void say() {
        System.out.print("1");
    }
}
class B extends A {
    static {
        System.out.print("B");
    }
    public B() {
        System.out.print("b");
    }
    void say() {
        System.out.print("2");
    }
}
public class Hello {
    public static void main(String[] args) {
        A ab = new B();
        ab.say();
        ab = new B();
        ab.say();
    }
}

这道题的输出结果是:

ABab2ab2

首先是创建一个B的对象然后向上造型赋给A的引用,静态代码块是类一加载就执行,所以输出ABab,然后紧接着调用say方法,因为A的子类B里面重写了say方法所以调用的是B类里的say方法输出2,下面的同理,这里需要注意的是静态代码块只执行一次
例题:

public class Main {

    private static View mView;

    public static void main(String[] args) {
        mView = new DecorView();
        mView.measure();
    }

}

class DecorView extends FrameLayout {
    @Override
    public void onMeasure() {
        super.onMeasure();
        System.out.println("decor onMeasure");
    }
}

class FrameLayout extends ViewGroup {
    @Override
    public void onMeasure() {
        System.out.println("frame onMeasure");
    }
}
abstract class ViewGroup extends View {
    public abstract void onMeasure();
}

class View {
    public final void measure() {
        System.out.println("view measure");
        onMeasure();
    }

    public void onMeasure() {
        System.out.println("view onMeasure");
    }

}

输出结果:

view measure
frame onMeasure
decor onMeasure

首先创建一个DecorView对象,然后向上造型为View,调用measure方法输出view measure,因为子类重写了onMeasure方法,所以先调用FrameLayout类里面的onMeasure方法输出frame onMeasure,再调用DecorView里面的onMeasure方法输出decor onMeasure

相信看了这两道例题,大家对向上造型后调用方法的规则也有了一定认识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值