当前位置: 首页 > 面试题库 >

在Java中使用Upcasting有什么需要?

寿亦
2023-03-14
问题内容

我已经浏览了网络上的大多数论文,但是我仍然无法理解为什么我们必须使用向上转换。

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();
    }
}

您可以考虑使用此示例进行上播。这里的向上转换有什么用?两者da给出相同的输出!


问题答案:

在大多数情况下,完全没有必要进行明确的插播,也没有任何效果。

在您的示例中,显式上行

    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库创建的类执行此操作/是否可以在运行时使用反射来修改类实例? 在其他哪些情况下,通常还会使用反射? 我试图了解反射如何适用。 问题答案: 任何时候您在运行时处理字符串,并希望将该字符串的一部分视为语言中的标识符。 远程过程调用-将通过网络接收的消息的一部分视为方法