Java中用于非基本类型的向上转换

时间:2016-01-06 19:16:55

标签: java casting

让我们考虑我们有两个类A和B. B是A的子类,因为B扩展A.如果我们创建A类的实例并将其分配给A类将包含A的所有属性。类似地,当我创建B的实例并将其分配给B类型时,将获得B的所有属性以及A的属性,因为它是从A继承的。根据上面的行,A的实例包含与属性相比的属性。实例B.这意味着B的实例大于A的实例,因为当扩展时缩小隐式时,转换应该是显式的。根据我的理论,B的实例更大,我们试图将它存储在我们需要转换的A类型中。

{{1}}

上述转换是隐含发生的。但我的问题是它是如何隐含的,B的实例更大我们试图将其转换为A的小型。这是可能的???

通过示例回答我,提前谢谢你。

6 个答案:

答案 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;

定义引用 ba。在引擎盖下,引用是用指针实现的,因此,所有引用都是相同的大小。当然,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系列 希望这会有所帮助...