关于多态性的Java接口问题

关于多态性的Java接口问题,java,interface,polymorphism,Java,Interface,Polymorphism,所以我有这个: interface C { void shutUp(); } class A { public void speak() { System.out.println("Class a"); } } class B extends A implements C { public void shutUp() { System.out.println("Saying nothing..."); } pub

所以我有这个:

interface C {
    void shutUp();
}

class A {
    public void speak() {
       System.out.println("Class a");
    }
}

class B extends A implements C {
    public void shutUp() {
        System.out.println("Saying nothing...");
    }

    public void speak() {
        System.out.println("Class B");
    }
}
如果我这样做,它会起作用:

A obj = new B();
obj.speak()
但是我做不到obj.shutUp()为什么不呢?我有一种感觉,我只是对一些非常基本的事情感到困惑


谢谢

您的
obj
具有来自类
A
的接口,因为它是您变量的类型。

您的
obj
具有来自类
A
的接口,因为它是您变量的类型。

A的静态类型未连接到C,因此您无法执行此命令,执行以下操作的方式相同:

A obj = new A();
obj.shutUp();
(这显然是违法的.)
唯一能同时使用两者的是B

B obj = new B();
obj.shutUp();
obj.speak();

这一切都与Java是静态类型这一事实有关,即A的静态类型未连接到C,因此您无法执行此命令,执行此命令的方式与执行以下操作相同:

A obj = new A();
obj.shutUp();
(这显然是违法的.)
唯一能同时使用两者的是B

B obj = new B();
obj.shutUp();
obj.speak();

这一切都与Java是静态类型这一事实有关,因为A不是C-它没有实现接口-并且不能以这种方式实例化接口,因为没有默认构造函数

类型A的引用没有方法
shutUp()
,因此它不起作用也就不足为奇了


您的代码使用了不正确的关键字:它是Java的
class
interface
。案例很重要。

因为A不是C—它不实现接口—并且您不能以这种方式实例化接口,因为没有默认构造函数

类型A的引用没有方法
shutUp()
,因此它不起作用也就不足为奇了


您的代码使用了不正确的关键字:它是Java的
class
interface
。案例问题。

obj
的类型定义为
A
;因此,
obj
只能使用
A
可用的成员。由于
C
继承自
A
C
具有所有需要被视为
A
形式的成员,因此它允许您在
A
变量中创建新的
C
。只有将其强制转换为类型
C
,您才能使用属于
C
的所有成员
obj
的类型定义为
A
;因此,
obj
只能使用
A
可用的成员。由于
C
继承自
A
C
具有所有需要被视为
A
形式的成员,因此它允许您在
A
变量中创建新的
C
。只有将其强制转换为
C
类型,才能使用属于
C

的所有成员。您的问题是错误的:您无法创建C对象,因为它是接口-因此我认为您需要创建B对象,然后:

这是因为obj不是C,要使用关闭方法,您可以:

((C) obj).shutUp() // cast to C type
((B) obj).shutUp() // cast to B type
或声明:

B obj = new B();
obj.shutUp();
或:


您的问题是错误的:您不能创建C对象,因为它是接口-所以我认为您需要创建B对象,然后:

这是因为obj不是C,要使用关闭方法,您可以:

((C) obj).shutUp() // cast to C type
((B) obj).shutUp() // cast to B type
或声明:

B obj = new B();
obj.shutUp();
或:

A obj=新的C()

因为C是接口,所以不能创建接口的实例。请纠正这个问题

A obj=新的C()


因为C是接口,所以不能创建接口的实例。请更正问题。

您无法在obj上呼叫关机的原因如下:

obj不是对象,它是指针或引用。执行new B()时创建的对象是一回事,而obj(或“如何使用对象”)是另一回事。在引用(在本例中为obj)的帮助下使用对象,该引用允许访问实际对象的不同侧面

如果用于访问对象的引用属于引用当前对象的类型(即具有相同的名称),则可以通过此引用访问整个对象。否则,只能访问引用类型可以看到的对象部分


在您的示例中,引用类型是A,即obj只看到它所引用的任何对象的A部分。因此,它无法访问对象的B/C部分,尽管对象具有这些行为。

无法在obj上调用shutUp的原因是:

obj不是对象,它是指针或引用。执行new B()时创建的对象是一回事,而obj(或“如何使用对象”)是另一回事。在引用(在本例中为obj)的帮助下使用对象,该引用允许访问实际对象的不同侧面

如果用于访问对象的引用属于引用当前对象的类型(即具有相同的名称),则可以通过此引用访问整个对象。否则,只能访问引用类型可以看到的对象部分


在您的示例中,引用类型是A,即obj只看到它所引用的任何对象的A部分。因此,它无法访问对象的B/C部分,尽管对象具有这些行为。

其他人已经回答了这一问题,但请注意,有一种方法可以调用
shutUp()
,而无需强制转换到
B
C

A obj = new B();
try {
    Method shutUp = obj.getClass().getMethod("shutUp", null);
    shutUp.invoke(obj, null);
}
catch (Exception ignored) {}

其他人已经回答了这个问题,但请注意,有一种方法可以调用
shutUp()
,而不必强制转换到
B
C

A obj = new B();
try {
    Method shutUp = obj.getClass().getMethod("shutUp", null);
    shutUp.invoke(obj, null);
}
catch (Exception ignored) {}
这里您正在创建类型为“A”的“B”实例。 i、 你说的是“我想做一个对象B,并把它命名为obj,它是A型的”

在类A中,只有一个方法是可访问的。它没有实现C

public void speak() {}
为了能够访问类B的所有方法,您应该创建一个类型为“B”的“B”实例

这样您就可以访问

 public void shutUp() {}
这是因为B实现了类“C”

使用“obj”访问这两种方法的一种方法是使用C实现

public void speak() {}
H