关于多态性的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