我已经浏览了网络上的大多数论文,但是我仍然无法理解为什么我们必须使用向上转换。
class Animal
{
public void callme()
{
System.out.println("In callme of Animal");
}
}
class Dog extends Animal
{
public void callme()
{
System.out.println("In callme of Dog");
}
public void callme2()
{
System.out.println("In callme2 of Dog");
}
}
public class UseAnimlas
{
public static void main (String [] args)
{
Dog d = new Dog();
Animal a = (Animal)d;
d.callme();
a.callme();
((Dog) a).callme2();
}
}
您可以考虑使用此示例进行上播。这里的向上转换有什么用?两者d
并a
给出相同的输出!
在大多数情况下,完全没有必要进行明确的插播,也没有任何效果。
在您的示例中,显式上行
Animal a = (Animal)d;
可以替换为:
Animal a = d; // implicit upcast
隐式转换(用于Java对象类型)的目的是“忘记”静态类型信息,以便具有特定类型的对象可以在需要更通用类型的情况下使用。这会影响编译时类型检查和重载解析,但不会影响运行时行为。
(对于原始类型,向上转换会导致转换,并且在某些情况下会导致精度损失;例如long
-> float
。)
但是,在某些情况下,显式上载的存在会更改语句/表达式的含义。
在Java中有必要使用向上转换的一种情况是,您想强制使用特定的方法替代。例如,假设我们有重载的方法:
public void doIt(Object o)...
public void doIt(String s)...
如果我有一个String,并且想调用第一个重载而不是第二个重载,则必须这样做:
String arg = ...
doIt((Object) arg);
一个相关的案例是:
doIt((Object) null);
没有类型转换,代码将无法编译。(我不确定这是否算是高潮,但还是这样。)
第二种情况涉及可变参数:
public void doIt(Object... args)...
Object[] foo = ...
doIt(foo); // passes foo as the argument array
doIt((Object) foo); // passes new Object[]{foo} as the argument array.
第三种情况是在对原始数值类型执行操作时。例如
int i1 = ...
int i2 = ...
long res = i1 + i2; // 32 bit signed arithmetic ... might overflow
long res2 = ((long) i1) + i2; // 64 bit signed arithmetic ... won't overflow
问题内容: 我如何使用AtomicBoolean?该类的作用是什么? 问题答案: 当有多个线程需要检查并更改布尔值时。例如: 这不是线程安全的。您可以使用以下方法修复它:
问题内容: 我有一个将对象保存到数据库的EJB。在我看到的一个示例中,一旦保存了此数据(EntityManager.persist),就会调用EntityManager.flush();。为什么我需要这样做?我要保存的对象未附加,以后在该方法中也不会使用。实际上,一旦保存,该方法就会返回,并且我希望资源会被释放。(示例代码也在remove调用上执行此操作。) 问题答案: 调用将强制数据立即被持久保
问题内容: 在Java中,obj.hashCode()返回一些值。该哈希码在编程中有什么用? 问题答案: 用于铲装在Hash实现喜欢等。 从中接收的值用作存储集合/映射元素的存储桶编号。该存储桶编号是集合/映射中元素的地址。 完成后,它将获取元素的哈希码,然后查找哈希码指向的存储桶。如果在同一存储桶中找到了多个元素(多个对象可以具有相同的哈希码),则它将使用该方法来评估这些对象是否相等,然后确定是
问题内容: 改善这个问题 Java 中的示例应用程序是什么?请列出使用此示例的任何示例方案。谢谢! 问题答案: 这是对它的用途和缺点的很好的描述。本质上,只要需要执行快速的低级I / O,就可以使用它。如果您打算实现TCP / IP协议,或者如果您正在编写数据库(DBMS),则该类将派上用场。
问题内容: 我知道String [] args是作为参数传递给main的字符串数组。 但是,当您不将其包含为参数时(即使您不使用它),它也会引发异常。那么为什么需要它呢?另外,为什么不能是int []或boolean []? 问题答案: 这是一个字符串,因为命令行以文本形式表示。如果要将文本转换为整数或布尔值,则必须自己做- 操作系统或Java引导程序如何确切知道您希望如何解析所有内容?我想Jav
问题内容: 因此,通过阅读一些文章,我得到的信息是能够实时修改字段并为类设置值,而无需重新编译。 所以有可能对没有源代码的第三方Java库创建的类执行此操作/是否可以在运行时使用反射来修改类实例? 在其他哪些情况下,通常还会使用反射? 我试图了解反射如何适用。 问题答案: 任何时候您在运行时处理字符串,并希望将该字符串的一部分视为语言中的标识符。 远程过程调用-将通过网络接收的消息的一部分视为方法