什么是类型转换实际上在java中意味着什么?

时间:2011-08-05 06:18:30

标签: java object interface

它是否将一个对象更改为另一个对象?如果Imonitor是接口Imonitor[] x = new Imonitor();是什么意思?这是否意味着我们可以创建接口对象?

6 个答案:

答案 0 :(得分:3)

嗯,根据你所谈论的类型,演员会做不同的事情。考虑:

Object x = "hello";
String y = (String) x;

这不会改变对象的类型 - 但是它会将Object类型的引用转换为引用类型String的类型,通过检查引用是指String(或更一般地,是否为强制类型或子类的目标类型)或null。

对于基本类型,它实际上 创建不同类型的新数据值,更改复制的信息,而不仅仅是更改对信息的引用:

double x = 10.5;
int y = (int) x; // The value of y is 10; x is unchanged though.

关于接口:

Imonitor[] x = new Imonitor();

这不会直接编译。但这会:

Imonitor[] x = new Imonitor[2];

这不是创建Imonitor本身的任何实例 - 它只是创建一个带有两个“插槽”的数组,这两个“插槽”能够保存对实现Imonitor类型的对象的引用。这两个插槽中的初始值为null;然后你可以像这样填充数组:

x[0] = new FirstImplementation();
x[1] = new SecondImplemnentation();

...创建具体实现类的实例。

答案 1 :(得分:1)

  
    

是否将一个对象更改为另一个对象?

  

(1)否。对于参考类型

a = (typename)b; 

通知编译器您“知道”'b'指向的对象也是'typename'类型的对象。也就是说,它是一个运算符而不是对象。 (对于原始类型,它实际上是转换)。

  
    

如果Imonitor是一个接口Imonitor [] x = new Imonitor();手段?

  

(2)它不会编译。 Imonitor是一个类型名称。 Imonitor []是一组IMonitors。

  
    

这是否意味着我们可以创建接口对象?

  

(3)否。但你可以创建一个对Imonitor的引用数组,这就是

new IMonitor[3]

会做的。

答案 2 :(得分:1)

如果Imonitor是接口,则new Imonitor();不起作用。

Imonitor[] xImonitor - 数组而不是Imonitor变量。

答案 3 :(得分:1)

如果Imonitor是一个接口,则新的Imonitor()将无效 - 您将收到编译错误。

转换对象是为了更改编译器认为对象具有的类型(静态类型)并进行检查。当程序运行时,JavaVm会检查强制转换是否有效,如果不是则抛出异常。

接口永远不能是对象,你必须有一个实现接口的类。

答案 4 :(得分:1)

正如其他人所说(我在评论中做过),你不能直接实例化一个界面。我建议你阅读Java接口以便更熟悉它们 - 它们最初可能会令人困惑,但它们是语言的关键部分。

Here is the section在Java教程的接口上。​​

答案 5 :(得分:0)

类型转换也称为type conversion,它将对象从一种数据类型更改为另一种数据类型。在非原始对象中,对具有某些层次结构特征的对象进行类型转换。示例:Person对象有2个子类,名为ParentChild(两个子类具有与继承Person相同的层次结构),因此这是一种有效的类型转换:

Person person = new Parent();
Parent parent = (Parent) person;

对于您的示例,Imonitor[] x = new Imonitor();将无法编译,因为您将Imonitor的单个对象分配给期望 Imonitor数组的实例。< / p>

但这会编译:

Imonitor[] x = new Imonitor[2]; //Assigning 2 elements to array 'x'

假设您有一个界面:

public interface IMonitor {

    public void monitor(Monitorable object) throws MonitorException;
}

然后这不是一个类型转换示例,而是一个赋值:

IMonitor x = new IMonitor() {
            public void monitor(Monitorable object) throws MonitorException {
                //Implementation done here...
            }
        };

(以上示例演示了anonymous class)。

我希望这很清楚。