java - 当我从扩展特定接口(interface)的类创建对象时,我可以在使用该接口(interface)的地方使用该对象吗?

标签 java inheritance interface implements

我知道我可以传递一个接口(interface)作为参数。因为我们无法从接口(interface)创建对象!我可以从创建一个扩展这个接口(interface)的对象吗,然后我在使用这个接口(interface)<的地方使用这个对象 作为参数?

我的问题是,由于 obj 是来自 Final 类的对象,我可以在此处将其用作参数吗(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 {
}

最佳答案

是的,你可以做到。 接口(interface)是 Java 中避免多重继承的一种方式,即声明类 Foo 来扩展类 Bar 并实现接口(interface) Bar 意味着我们FooBar/Baz 之间存在“is a”关系。因此,“Foo is a Bar”和“Foo is a Baz”是正确的,或者在您的情况下 Final 是一个 One。因此,如果类型是子类型(或者在 Java 中实现接口(interface)),则可以使用子类型来代替类型或接口(interface)(请参阅里氏替换原则)。

当您声明方法 m1(One one) 时,您要求第一个参数的类型为 One,并且 FinalOne这显然是正确的。

请注意,即使您传入 Final 类型的对象,该方法也只能“看到”该对象的接口(interface)部分,而不会对其进行强制转换。

关于java - 当我从扩展特定接口(interface)的类创建对象时,我可以在使用该接口(interface)的地方使用该对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61238148/

相关文章:

Java:可点击元素的网格

r - 如何在给定索引数据帧的情况下创建 cclust 对象

java - 如何打乱字符串?

java - 什么更好 : a single class with some attributes unfilled or multiple classes with attributes filled?

java - Android下Bitmap.setPixels扭曲颜色

c# - 接口(interface)继承和属性隐藏麻烦

c++ - 我可以在 C++11 的类外执行继承吗?

java - 从不同特征继承同名方法

java - JDO PersistenceManager 内存泄漏

go - 如何测试一个接口(interface)变量的底层类型 接口(interface)变量的类型是别名