让我们考虑我们有两个类A和B. B是A的子类,因为B扩展A.如果我们创建A类的实例并将其分配给A类将包含A的所有属性。类似地,当我创建B的实例并将其分配给B类型时,将获得B的所有属性以及A的属性,因为它是从A继承的。根据上面的行,A的实例包含与属性相比的属性。实例B.这意味着B的实例大于A的实例,因为当扩展时缩小隐式时,转换应该是显式的。根据我的理论,B的实例更大,我们试图将它存储在我们需要转换的A类型中。
{{1}}
上述转换是隐含发生的。但我的问题是它是如何隐含的,B的实例更大我们试图将其转换为A的小型。这是可能的???
通过示例回答我,提前谢谢你。
答案 0 :(得分:1)
您正在考虑对象大小,但在Java中,永远不会包含非原始类型,仅提及。因此,您的代码正在转换new B()
的结果,其类型为“对B的引用”,以键入“对A的引用”。由于所有引用都是相同的大小,因此在转换中不会丢失任何数据。
答案 1 :(得分:0)
演员实际上并不像你所说的那样暗示。实际发生的是:
B b1 = new B();
A a1 = (A)b;
(A)
是一个显式演员,更重要的是停止考虑 size B
的em>与A
的 size 不同。这可以是隐式分配,因为B
IS-A A
,因此使用A
作为B
的接口是完全安全的,因为我们知道B
至少与A
定义的成员相同
因此,完全安全(而非错误)的方法很简单:
A a1 = new B();
完成!
答案 2 :(得分:0)
所以,我真的不明白你的问题。我只是觉得你对B级成员在他的超级班级上学时会发生什么感到困惑。在这种情况下,您最终获得了A的实例,这意味着对象类型为A,而未存储B的数据将保留。
答案 3 :(得分:0)
在Java中,使用
B b = new B();
A a = b;
定义引用 b
和a
。在引擎盖下,引用是用指针实现的,因此,所有引用都是相同的大小。当然,B
的实例可能确实需要比A
的实例更多的内存(我接受它,这就是你的意思"更大")。
顺便说一句,在C ++中并非如此。
B b();
确定了一个对象,而不是一个引用,因此
A a = b;
C ++中的确实不允许。
答案 4 :(得分:0)
想一想:
class Animal{
public void eat(){}
}
class Monkey extends Animal{
public void climbTree(){}
}
我现在可以这样做:
Animal someAnimal = new Monkey(); //This is ok. (Create a Monkey and identify is as an Animal)
someAnimal.eat(); //This is ok too. (All Animal objects can eat)
someAnimal.climbTree(); //Not ok. Java sees someAnimal as a general Animal, not a Monkey yet.
从上面的例子中,someAnimal是一个Monkey
对象,存储在更高层次的变量(Animal
)中。
对象本身被认为是一个更通用的类(Animal
类),我认为这里没有进行隐式转换,因为所有的猴子都已经是动物(但不是相反)。
当您希望让编译器知道该对象实际属于更具体的类时,可以进行显式转换。例如:
((Monkey)someAnimal).climbTree(); //This is ok. Inform Java someAnimal is actually a Monkey which knows how to climb.
答案 5 :(得分:0)
示例:
Class Employee {
private String name;
private double Salary;
//getter & setter
//mutators to increase salary etc;
}
class Manager extends Employee {
private double bonus;
//inherits methods from superclass
// sub class specific methods
}
Employee e = new Manager(); //is fine as manager is also an Employee...
前缀super和sub来自理论计算机科学和数学中使用的集合的语言。所有员工的集合包含所有管理者的集合,因此被认为是管理者集的超集。或者,换句话说,所有经理的集合都是所有员工集合的一部分。
〜来自核心java系列 希望这会有所帮助...