我一直致力于某些事情并且遇到了一些有趣的接口。我认为这很常见,但我是新手。我只是想确定我所做的是否正确。
让我们假设我有一个接口说B。
interface B {}.
我有一个实现B的A类。
class A implements B { }.
现在让我们说我们有一个C类,我们在其中使用接口B.
class C {
private B b;
public void setB(B b) {
this.b = b;
}
public B getB() {
return b;
}
}
我们有另一个测试类如下:
public class TestAll {
private final C c = new C();
private final A a = new A();
private final B b = null;
void test123(){
c.setB(a);//[1]
c.setB(b);//[2]
}
}
所以现在我的问题是方法调用[1]是正确还是错误?如果它是正确的,我相信它是OOP概念之一,那是什么?我很抱歉,如果它是直接的,我是所有这些Java的新手。
谢谢。
答案 0 :(得分:2)
我认为OOP概念只是多态性。请参阅https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
B对象可以有多种形式和形状,即A,但它可以是实现接口B的任何其他对象。
答案 1 :(得分:1)
接口代表了一种抽象方式来划分一个类可以做什么什么以及如何确切地类将这样做,因为A实现B,这意味着A类“CAN “做B合同提供的接口,因此c.setB(a);//[1]
100%有效。
此方法“setB(B b)”可以读作给我一些可以做B提供的东西,无论如何
Ergo :这是一种有效的方法调用。
第二次调用显然是有效的。
答案 2 :(得分:1)
这是正确的,你可以随时传递一个子类型(类A实现B),无论你期望继承类型(B)。
但是,在B类setB()中,您可以将传递的参数视为B(并且您无法访问A类的其他属性或方法)。
我建议你首先用纯继承实现更简单的现实生活项目,没有接口和抽象类来掌握这一切。
例如,假设您正在为Pub建模。在Pub中,有人类实例可以消耗的饮料。
class Drink {
String name;
double servingSize;
public Drink(String name,double servingSize) {
this.name=name;
this.servingSize=servingSize;
}
}
class Snaps extends Drink {
public Snaps() {
super("Finlandia Vodka",0,5);
}
}
class Human {
public void consume(Drink drink) {
// do something
}
}
现在你的问题是一个人是否只能消耗一个Drink实例,或者一个后代,所以一个Snaps?答案当然是人类可以消耗Snaps,因为Snaps是Drink的后代。一旦人类可以饮用一种饮料,他就可以饮用任何饮料后代。
我希望它让事情变得更容易理解。 :)
答案 3 :(得分:0)
[1]是正确的。在contra方差原则下,您始终可以将对象作为参数传递给一个方法,该方法将对象的类或该类的任何父类指定为参数。