一个对象属于一个类是否可以分配给一个类型的变量,而该类型是一个没有强制转换的子类?

时间:2013-09-23 23:12:51

标签: java inheritance

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

首先,

一个对象属于一个类是否可以分配给一个类型的变量而不是强制转换?如果答案是肯定的,那么在将对象分配给超类时需要进行强制转换?或者我只是将它们翻过来?

其次,在接口中,具有单个参数的方法是否可以接受来自许多与继承无关的不同类的参数对象的参数值?我会对这个问题说“是”,因为界面可以通过不同的类扩展,但我不确定这是否正确。

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

2 个答案:

答案 0 :(得分:2)

我在第二个问题中没有得到你的意思,所以我会回答你的第一个和第三个问题,希望你能编辑你的问题并改写你的第二个问题。

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。但是,可以将特定类的对象分配给父类/接口的对象而不进行转换。例如:

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

2)你的问题没有说明参数的类型是否是一个接口,这有所不同。假设您具体询问了接口,那么是的,带参数的方法将接受参数类型或任何子类型的任何实例。 E.g。

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

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

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

答案 1 :(得分:1)

  1. 没有。当您拥有A类型的变量时,您指定给它的任何内容都必须 AA超类型B的引用不一定是指'A'。反过来了。

  2. 我认为您要问的是:如果方法接受接口类型的参数,它是否会接受实现此接口的各种类的实例,这些类之间没有其他(继承)关系?答案是肯定的:只要它们实现了该接口,它们就是合法的参数。

  3. 不,默认情况下,他们有包知名度