class A{
void f(Object a){System.out.println("a");};
}
class B extends A{
void f(int a) {System.out.println("b");};
}
A obj1 = new B();
obj1.f(1);
B obj2 = new B();
obj2.f(1);
输出
a
b
对象obj1的类型是A,实际指的向内存中的对象是B类型。
实际对象是B的实例化,所以obj1里包含了两个方法f(Object)和f(int),这两个方法都能执行。
因为对象类型是A,所以决定了当执行f方法时,要执行参数类型为Object的f方法,所以第一次会输出a。
class A{
void f(int a){System.out.println("a");};
}
class B extends A{
void f(int a) {System.out.println("b");};
}
A obj1 = new B();
obj1.f(1);
B obj2 = new B();
obj2.f(1);
输出
b
b
对象obj1的类型是A,实际指的向内存中的对象是B类型。
实际对象是B的实例化,因为B把A中的f方法重写了,所以obj1里只有一个f(int)方法,那就是B中的f(int a方法)。
因为对象类型是A,所以决定了当执行f方法时,要执行参数类型为int的f方法,所以第一次输出b。
上面示例中A更适合定义成抽象类。
A obj1 = new B();
,A类型决定了obj1可以执行的方法名及参数类型,A可能是B的父类,也可能是B继承的其一个接口,也可能就是B类。