当我从一个扩展特定接口的 class 创建一个对象时,我可以在我使用这个接口的地方使用这个对象吗?
When I create an object from a class that extends a specific interface, can I use this object in the place where I use this interface?
我知道我可以传递一个 interface
作为参数。因为我们不能从 interface
!我可以从 class
创建一个对象 extends
这个 interface
然后我在我使用这个 interface
作为参数的地方使用这个对象吗?
我的问题是,由于 obj
是来自 Final
class 的对象,我可以在此处将其用作参数 (m1(obj)
) 吗?请向我解释为什么?
package aaa;
public class AAA {
public static void m1(One one) {
System.out.print("AAA");
}
public static void main(String[] args) {
Final obj = new Final();
m1(obj);
}
}
interface One {
}
class Final implements One {
}
是的,你可以做到。
接口是 Java 中避免多重继承的一种方式,即声明 class Foo
扩展 class Bar
并实现接口 Bar
意味着我们在 Foo
和 Bar
/Baz
之间有一个 "is a" 关系。因此,“Foo
是 Bar
”和“Foo
是 Baz
”是正确的,或者在您的情况下 Final
是 One
。因此,如果类型是子类型(或在 Java 中实现接口),则可以使用子类型代替类型或接口(参见 Liskov 替换原则)。
当你声明一个方法 m1(One one)
时,你需要第一个参数是 One
类型,因为 Final
是一个 One
这显然是正确的。
请注意,即使您传入类型为 Final
的对象,该方法也只是 "sees" 对象的接口部分,而没有转换它。
我知道我可以传递一个 interface
作为参数。因为我们不能从 interface
!我可以从 class
创建一个对象 extends
这个 interface
然后我在我使用这个 interface
作为参数的地方使用这个对象吗?
我的问题是,由于 obj
是来自 Final
class 的对象,我可以在此处将其用作参数 (m1(obj)
) 吗?请向我解释为什么?
package aaa;
public class AAA {
public static void m1(One one) {
System.out.print("AAA");
}
public static void main(String[] args) {
Final obj = new Final();
m1(obj);
}
}
interface One {
}
class Final implements One {
}
是的,你可以做到。
接口是 Java 中避免多重继承的一种方式,即声明 class Foo
扩展 class Bar
并实现接口 Bar
意味着我们在 Foo
和 Bar
/Baz
之间有一个 "is a" 关系。因此,“Foo
是 Bar
”和“Foo
是 Baz
”是正确的,或者在您的情况下 Final
是 One
。因此,如果类型是子类型(或在 Java 中实现接口),则可以使用子类型代替类型或接口(参见 Liskov 替换原则)。
当你声明一个方法 m1(One one)
时,你需要第一个参数是 One
类型,因为 Final
是一个 One
这显然是正确的。
请注意,即使您传入类型为 Final
的对象,该方法也只是 "sees" 对象的接口部分,而没有转换它。