java - 是否可以将属于某个类的对象分配给子类类型的变量而不进行强制转换?

标签 java inheritance

我有 3 个问题,如果有人能向我解释,我将不胜感激。

首先,

是否可以将属于某个类的对象分配给子类类型的变量而不进行强制转换?如果答案是肯定的,则在将对象分配给父类(super class)时是否需要进行强制转换?或者我只是把它们翻过来了?

其次,在接口(interface)中,具有单个参数的方法可以接受来自许多不通过继承相关的不同类的参数对象作为该参数对象的参数值,这是否正确?我会对这个问题说"is",因为接口(interface)可以由不同的类扩展,但我不确定这是否正确。

最后,公共(public)类中的方法是否自动定义为公共(public)?或者它应该被定义为包?

最佳答案

我不明白你在第二个问题中的意思,所以我将发布你的第一个问题和第三个问题的答案,希望你能编辑你的问题并重新表述你的第二个问题。

1) 不,这是不可能的。否则,可能会发生以下情况:

SomeInterface object1 = new Class1ImplementingInterface ();
Class2ImplementingInterface object2 = object1;    // Won't compile

上面这段代码无法编译。但是,如果将其更改为:

SomeInterface object1 = new Class1ImplementingInterface ();
Class2ImplementingInterface object2 = (Class2ImplementingInterface) object1;    // Compiles, but will crash at runtime

它会编译,但会在运行时抛出ClassCastException。但是,可以将特定类的对象分配给父类/接口(interface)的对象而不进行转换。例如:

Class2ImplementingInterface object2 = new Class2ImplementingInterface ();
SomeInterface object1 = object2;    // OK

2)您的问题没有指定参数的类型是否是接口(interface),这会有所不同。假设您专门要求接口(interface),那么是的,带有参数的方法将接受参数类型的任何实例或任何子类型。例如

public void someMethod (SomeInterface parameter) {
    // Implementation
}

上面的代码将接受任何实现SomeInterface的类的对象。但是,如果参数的类型是类,则仅接受同一类的对象或扩展此基类的任何类。

3) 不可以,成员、构造函数和方法的默认访问权限是package private,这意味着只有同一包中的类才能访问这些内容。您必须为要公开的成员指定 public 访问修饰符。

关于java - 是否可以将属于某个类的对象分配给子类类型的变量而不进行强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970407/

相关文章:

java - Http Session 未过期

java - 如何从Hibernate获取连接池信息?

c++ - 将 shared_ptr<Base> 作为 shared_ptr<Derived> 传递

c# - 如何反射(reflect)用于继承的泛型参数

C++ 设计 : inheritance and returning opaque handles

inheritance - 如何在 TypeScript 的派生类中重载构造函数?

c++ - 构造函数和g++编译配方的问题

java - 调用 PaintComponent 时数组的大小变为 0

JAVA SWT/AWT Eclipse Mac OSX Java Cocoa CompatibilityMode Enabled

java - 为什么要使用 Mockito?