最近做了几道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
相信看了这两道例题,大家对向上造型后调用方法的规则也有了一定认识。