Java 抽象、扩展和创建实例问题

Java 抽象、扩展和创建实例问题,java,instance,abstract-class,abstract,extends,Java,Instance,Abstract Class,Abstract,Extends,Klasse1是一个抽象类,具有foo()方法Klasse2扩展了Klasse1并具有doo()方法,但不覆盖foo()方法 为什么我不能在Tester类中调用doo()方法 Klasse1.java public abstract class Klasse1 { public void foo() { System.out.println("Klasse1"); } } public class Klasse2 extends Klasse1 { pu

Klasse1
是一个抽象类,具有
foo()
方法
Klasse2
扩展了
Klasse1
并具有
doo()
方法,但不覆盖
foo()
方法

为什么我不能在
Tester
类中调用
doo()
方法

Klasse1.java

public abstract class Klasse1 {
    public void foo() {
        System.out.println("Klasse1");
    }
}
public class Klasse2 extends Klasse1 {
    public void doo() {
        System.out.println("Klasse2");
    }
}
public class Tester {
    public static void main(String[] args) {
        Klasse1 k;
        k = new Klasse2();
        k.foo();
        k.doo(); // doesn't work
    }
}
Klasse2.java

public abstract class Klasse1 {
    public void foo() {
        System.out.println("Klasse1");
    }
}
public class Klasse2 extends Klasse1 {
    public void doo() {
        System.out.println("Klasse2");
    }
}
public class Tester {
    public static void main(String[] args) {
        Klasse1 k;
        k = new Klasse2();
        k.foo();
        k.doo(); // doesn't work
    }
}
Tester.java

public abstract class Klasse1 {
    public void foo() {
        System.out.println("Klasse1");
    }
}
public class Klasse2 extends Klasse1 {
    public void doo() {
        System.out.println("Klasse2");
    }
}
public class Tester {
    public static void main(String[] args) {
        Klasse1 k;
        k = new Klasse2();
        k.foo();
        k.doo(); // doesn't work
    }
}

在编译时,Java编译器检查引用类型而不是实例类型


在这种情况下,引用类型是
Klasse1
,它没有
doo()
。因此,它将抛出一个错误。

在编译时,Java编译器检查引用类型而不是实例类型


在这种情况下,引用类型是
Klasse1
,它没有
doo()
。因此,它将抛出一个错误。

Klasse1
没有
doo
方法,因此它是自然的

您可以将其转换为您的
Klasse2
,然后像这样使用:

((Klasse2)k).doo();

Klasse1
没有
doo
方法,所以它很自然

您可以将其转换为您的
Klasse2
,然后像这样使用:

((Klasse2)k).doo();

K
是类
Klasse2
的对象,但引用为
Klasse1

K
可以调用
Klasse1
声明的所有方法,并且可以调用
Klasse2
声明的所有方法(如果被强制转换到该类)

例子:
K
是类
Klasse2
的对象,但引用为
Klasse1

K
可以调用
Klasse1
声明的所有方法,并且可以调用
Klasse2
声明的所有方法(如果被强制转换到该类)

例子:
因为
Klasse1
没有
doo()@雷曼嗯。。。有了所有的
foo
doo
,我就没有
cloo
;)因为
Klasse1
没有
doo()@雷曼嗯。。。有了所有的
foo
doo
,我就没有
cloo
;)谢谢这解决了我的问题!谢谢这解决了我的问题!