我定义了2个对象
在Object-1中,当我引用子对象时,它调用子方法m1(),而在Object-2中,当我引用子方法m1()时,它引用了父对象..
在这两种情况下,我假设父对象将在运行时保存子类型对象...
对象-1
package pkgB;
class Parent{
static int i = 10;
void m1(){
System.out.println("In Parent = " + i);
}
static void m1(String s){
System.out.println(s +i );
}
}
public class Child extends Parent{
static int i = 20;
void m1(){
System.out.println("In child" + Child.i);
}
public static void main(String[] args){
Parent p = new Child();
p.m1();
}
}
对象-2
package pkgB;
class Drink{
public static void m1(){
System.out.println("Im Drink method");
}
}
class Coffee extends Drink{
public static void m1(){
System.out.println("Im Coffee method");
}
}
public class test {
public static void main(String[] args) {
Drink d = new Coffee();
d.m1();
}
}
输出Dobject-1:
In child20
输出Dobject-2:
Im Drink method
答案 0 :(得分:1)
静态方法由其类型调用,而实例方法则根据对象类型调用。 静态方法未被覆盖。
当你说,
Parent p = new Child();
p.m1();
您正在创建Parent
的引用类型,但对象类型为Child
。 m1()
是实例方法,因此它被覆盖并调用Child
方法,因为对象的类型为Child
但是,当你说,
Drink d = new Coffee();
d.m1();
这里,m1()
是static
方法,它绑定到类类型。因此,d.m1()
会调用static
方法,d
类型为Drink
答案 1 :(得分:1)
在第二个示例中,m1()
方法是静态方法。执行d.m1()
时,编译器应该给出一个警告,这是关于以非静态方式引用静态方法的。
无论如何,当您在第二个示例中致电d.m1()
时,您真正致电Drink.m1()
,因为d
被宣布为Drink
。
答案 2 :(得分:0)
使用引用变量调用静态方法意味着您处于Sin状态:)
静态方法/变量只是类的一部分,不能被覆盖。