Java 为什么不';多态性在这种情况下不起作用吗?
方法调用Java 为什么不';多态性在这种情况下不起作用吗?,java,polymorphism,Java,Polymorphism,方法调用aThing.intValue()是一个编译器错误。为什么多态性在这种情况下不起作用 我的教科书中还有一个相关的陈述,有点复杂: 可以执行操作的决定因素是引用的类型,而不是被引用对象的类型 你能简要说明一下吗 其中asComputer[]labComputers=新计算机[10]适用于多态性 Object aThing = new Integer(25); 添加了: 我相信在中间的某个地方,会有 public class Computer { int ram; publ
aThing.intValue()
是一个编译器错误。为什么多态性在这种情况下不起作用
我的教科书中还有一个相关的陈述,有点复杂:
可以执行操作的决定因素是引用的类型,而不是被引用对象的类型
你能简要说明一下吗
其中asComputer[]labComputers=新计算机[10]代码>适用于多态性
Object aThing = new Integer(25);
添加了:
我相信在中间的某个地方,会有
public class Computer {
int ram;
public Computer(int rm){
ram= rm;
}
public String toString(){
String result = "ram is " + ram;
return result;
}
}
public class Notebook extends Computer{
int size;
public Notebook(int rm, int sz){
super(rm);
size = sz;
}
@Override
public String toString(){
String result = super.toString() + " size is " + size;
return result;
}
}
对于方法调用labComputers[1].toString()
,polymophism确保调用正确的toString
。在我看来,labComputer[1]=新笔记本(2,15)
相当于对象o=新整数(25)代码>。但是多态性对我的计算机示例有效,而不是在对象整数示例中。为什么?因为即使整数
是对象
,对象
不是整数
,因此它没有整数
的方法,只有对象
可以执行操作的决定因素是引用的类型,而不是被引用对象的类型
这意味着,即使被引用的对象包含更多功能,如果引用的类型与对象的类型不同,则只有引用类型的功能可用
在以下方面:
labComputer[1] = new Notebook(2,15);
labComputer[2] = new Computer(2);
aThing
的类型声明为Object
。即使实现包含的内容不止这些,但实现包含的任何其他内容都不再可见,因为变量的类型不是Integer
,而是Object
。对象
和整数
都有相同的方法,但从现在起,您只能访问对象
提供的方法,因为除了您之外,没有人知道这实际上是一个整数
,而不仅仅是一个对象
在第二个示例中,它们意味着即使Object
和Integer
都有相同的方法,当您调用其中一个方法时,也会调用实际类型的方法。因此,在本例中,如果您在aThing
上调用toString()
,您将调用Integer
的toString()
方法,而不是对象。因此,这只是一个访问问题。将其声明为对象
的事实并不意味着您将获得对象
的方法来响应调用,它只意味着整数
中存在而不在对象
中的任何方法都将不可用
例如:
Object aThing = new Integer(25);
现在让我们创建一个笔记本
:
class Computer {
public int getInstalledOperatingSystems() { return 3; }
}
class Desktop extends Computer {
public String getShapeOfCase() { ... }
}
class Notebook extends Computer {
public int getInstalledOperatingSystems() { return 1; }
public String getBrand() { ... }
public void closeLid() { ... }
}
showStatistics(n);
假设您有以下方法:
Notebook n = new Notebook();
如果使用上面定义的笔记本
调用此方法:
public String showStatistics(Computer computer) {
result = "Operating systems: " + computer.getInstalledOperatingSystems();
return result;
}
然后该方法将接收笔记本
,因为笔记本
是计算机
。它可以调用笔记本
的getInstalledOperatingSystems()
方法,因为任何计算机
都有该方法。当它调用它时,结果将接收1
,因为笔记本
覆盖了计算机
的实现。但是showStatistics()。不管怎么说,它有一台计算机
,它不知道计算机
没有的任何其他方法
你可以给它发送一个桌面
,或者明天你可以创建一个扩展桌面
的游戏机
,或者一个扩展计算机
的服务器
类。你也可以寄这个。但是showStatistics()。它甚至在编写showStatistics()
时还没有发明
这与以下说法是一致的:服务器
始终是计算机
,而计算机
并不总是服务器
你可以查一下。因此,如果您知道您可能会被传递到笔记本
,而不仅仅是一台计算机,您可以查找它,甚至可以调用笔记本
的方法,但您必须确保您正在查看笔记本
:
class Computer {
public int getInstalledOperatingSystems() { return 3; }
}
class Desktop extends Computer {
public String getShapeOfCase() { ... }
}
class Notebook extends Computer {
public int getInstalledOperatingSystems() { return 1; }
public String getBrand() { ... }
public void closeLid() { ... }
}
showStatistics(n);
它不起作用,因为您的变量来自Object
类,所以只能使用Object
类中的方法。如果要将其用作整数
,应首先执行(向下)类型转换:
if (computer instanceof Notebook) {
// this is definitely a Notebook, so you can assure the compiler
// of that explicitly, by using a cast
Notebook notebook = (Notebook) computer;
result += "This isn't just a generic computer, it's actually a notebook! ";
// now that you have a variable of type Notebook, you can call
// whatever Notebook provides
result += "It's produced by: " + notebook.getBrand();
}
现在,为什么我们可以工作?因为如果类型转换不起作用,向下转换可能会抛出ClassCastException
在您的示例中,我将发布一个基本代码来说明polymophism是如何工作的:
Integer aInteger = (Integer)aThing;
//it could maybe work
aInteger.intValue();
这样想,dog是一个对象,dog类可能有如下方法
dog.bark()
如果将层次向上投射到对象,则对象的特定性会降低
objecto=dog代码>
现在你们只知道o是一个物体,你们不知道什么样的物体,所以你们不知道这个物体是否会吠叫
当你向上移动层次结构时,你几乎总是会因为对你拥有的东西不太明确而失去功能。编译器需要被告知对象应该是什么类型,这样它就可以查找类并查看方法是否合法
所以你可以说objectathing=newinteger(25)代码>但是你想说intthingvalue=(整数)aThing.intValue()代码>
如果有一个MySubClass对象是subc