Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,向上转换是如何工作的?_Java_Casting_Downcast_Upcasting - Fatal编程技术网

在Java中,向上转换是如何工作的?

在Java中,向上转换是如何工作的?,java,casting,downcast,upcasting,Java,Casting,Downcast,Upcasting,我在java中使用了向上投射和向下投射的概念,也被称为加宽和缩小 从派生类到基类自动进行向上转换(加宽)。i、 e如果它有一个is-a关系 对于运行时检查,必须显式地进行向下投射 好的,我知道了概念和一切。但是,它在这种情况下是如何工作的 public class ObjPair { Object first; Object second; public ObjPair(Object first, Object second) { this.firs

我在java中使用了向上投射和向下投射的概念,也被称为加宽和缩小

  • 从派生类到基类自动进行向上转换(加宽)。i、 e如果它有一个is-a关系
  • 对于运行时检查,必须显式地进行向下投射
好的,我知道了概念和一切。但是,它在这种情况下是如何工作的

public class ObjPair {
    Object first;
    Object second;

    public ObjPair(Object first, Object second) {
        this.first = first;
        this.second = second;
    }

    public Object getFirst() {
        return first;
    }    
    public Object getSecond() {
        return second;
    }

    public static void main(String[] args) {
        ObjPair objPair = new ObjPair("A",2.2); // Goes widning conversion
        System.out.println(objPair.getFirst());
        System.out.println(objPair.getSecond());
    }
}
ObjPair ObjPair=新ObjPair(“A”,2.2)

  • 这是通过向上转换,字符串到对象,双精度到对象,状态存储在objPair中。太好了
现在,当我执行objPair.getFirst()objPair.getSecond()时。它返回我A2.2

  • 它是如何记住字符串和double的,加宽/上抛应该记住超类的状态和方法
  • 它如何访问子类类型和值

记住:内存中的对象是它是什么。如果创建双对象,则它是类似于数值的双对象

保存引用的变量使用的是超级类型这一事实根本不会影响引用的对象

在您的示例中,自动装箱在封面下创建一个Double对象,并且
getSecond()
返回对该Double对象的引用


这就是全部。

请记住:内存中的对象是它是什么。如果创建双对象,则它是类似于数值的双对象

保存引用的变量使用的是超级类型这一事实根本不会影响引用的对象

在您的示例中,自动装箱在封面下创建一个Double对象,并且
getSecond()
返回对该Double对象的引用


这就是问题的全部。

强制转换对象引用不会更改对象。它只允许将其分配到不同类型的引用中。对象本身保持不变

在您的例子中,它需要两个
Object
引用,它检查兼容性(没有问题),然后在
Object
类型的变量中设置引用。实例本身不会改变。如果它们具有重写
对象
的方法,则将调用重写方法

因此,在打印对象的部分,它只使用
String.valueOf
,调用对象的
toString()
方法。从
对象
变量访问的实例实际上是一个
字符串
对象,
字符串
覆盖
toString()
以返回自身
Double
也会覆盖
toString
。调用这些覆盖,因为该实例仍然是
String
的实例和
Double
的实例。只有引用是
对象


请注意,您还有一个从
double
double
的转换。此隐式装箱确实会更改对象-它接受一个原语并从中创建一个新的
Double

对象引用的强制转换不会更改对象。它只允许将其分配到不同类型的引用中。对象本身保持不变

在您的例子中,它需要两个
Object
引用,它检查兼容性(没有问题),然后在
Object
类型的变量中设置引用。实例本身不会改变。如果它们具有重写
对象
的方法,则将调用重写方法

因此,在打印对象的部分,它只使用
String.valueOf
,调用对象的
toString()
方法。从
对象
变量访问的实例实际上是一个
字符串
对象,
字符串
覆盖
toString()
以返回自身
Double
也会覆盖
toString
。调用这些覆盖,因为该实例仍然是
String
的实例和
Double
的实例。只有引用是
对象


请注意,您还有一个从
double
double
的转换。这个隐式装箱确实改变了对象-它接受一个原语并从中创建一个新的
双精度

好的,就这样,让我们举个例子。您有一个大的方形框,命名对象和另一个小框。如果你把这个小盒子放在你的大盒子里,小盒子和大盒子的所有属性都在大盒子里。 然后在这个小盒子里,有两个棍子,第一个棍子标记为“A”,第二个棍子标记为“2.2”。 现在大盒子可以看到小盒子里面是什么。就在那一刻,这个小盒子有两根棍子,并按原样贴上标签。
(请记住,对象类始终是java中每个类的超级类/父类)。

好的,就是这样,让我们举个例子。您有一个大的方形框,命名对象和另一个小框。如果你把这个小盒子放在你的大盒子里,小盒子和大盒子的所有属性都在大盒子里。 然后在这个小盒子里,有两个棍子,第一个棍子标记为“A”,第二个棍子标记为“2.2”。 现在大盒子可以看到小盒子里面是什么。就在那一刻,这个小盒子有两根棍子,并按原样贴上标签。
(请记住,对象类始终是java中每个类的超级类/父类)。

如果您只是测试此代码:

public class Main {

    public Object first;
    public Object second;


    public static void main (String[] args){
        Main a = new Main();
        a.first = new String("foo");
        a.second = 5;

        System.out.println(a.first.getClass().toString());
    }
}

它输出
类java.lang.String
。您可以看到它没有存储为
对象
。这是通过使用元数据来实现的,如果您只需测试以下代码:

public class Main {

    public Object first;
    public Object second;


    public static void main (String[] args){
        Main a = new Main();
        a.first = new String("foo");
        a.second = 5;

        System.out.println(a.first.getClass().toString());
    }
}
它输出<