首页 > 编程知识 正文

java向下转型类型转换的问题(java向下转型类型转换的问题是什么)

时间:2023-12-07 20:37:50 阅读:313226 作者:LVQE

本文目录一览:

  • 1、java 向上转型 向下转型
  • 2、java的向下转型问题?
  • 3、java中向上转型,向下转型,强制类型转换的原理?
  • 4、java多态向上转型向下转型的问题

java 向上转型 向下转型

1.

引用a的类型是animal,是cat的父类。所以是“父类引用指向子类对象”。如果是“子类引用指向父类对象”,那应该写成

cat

a

=

new

animal();但这显然是不和逻辑的。

2.

你说的没错——“向上转型后,父类也只能调用父类已经有的方法”。但是子类如果覆盖了父类的方法,那么即使向上转型,方法的行为也表现为覆盖后的行为。这也是多态的一种体现。向上转型更多的用来体现一种编程上的“约定”。所有继承某个类或者实现某个接口的类,一定包含某个方法,这样在调用的时候,使得你也不必关系具体的实现细节,只要知道“这个类型中的某个方法能帮我完成工作”就可以了。

3.

向下转型,是“引用的类型”的变化,不是对象实例类型的变化。new什么,就是什么。不会因为向上或者向下转型而改变自己的类型。

4.

最后一个问题,不管向上还是向下转型,调用的都是实际类型中的那个方法。比如,animal

a

=

new

cat(); a.叫()。那这个叫就是cat类型实例中的“叫”方法。

java的向下转型问题?

首先还是给出解决办法吧:

package d;

import c.F;

public class A extends F

{

  public static void main(String[] args)

  { 

      A temp = new A();

      F f = (F) temp;

      if (f instanceof A)

      { 

          A a = (A) f;

          System.out.println(a.a());

      } 

  } 

输出结果:

你的要求无法实现。因为在你的例子中,f本身并不是由A类型向上转型为F得来的,所以本身是不会带有A的特性的,强制转换为A会失败,因为f在堆中的内容并未包括A类型的特性。即使你强制转换为A,A的新构造函数并不会调用,所有A额外的特性不会在堆中声明,所以会报错。Java中的向下转型是有条件的,你向下转型的对象必须原本在堆中包含了目的类型的内容,也就是说这个对象必须原本就是目的类型或其子类,只不过是通过向上转型现在不是目的类型或其子类罢了(但是堆中还是由该目的类型的特性存在,理解这一点很重要!)

有一个简单的办法验证这一点,就是你向下转型的时候,目的类型的构造函数并不会再一次调用,这样一来也就不会有目的类型的特性了,调用目的类型的特性自然而然就会失败了:

class Parent

{

  public Parent()

  { 

      System.out.println("This is Parent");

  } 

}

public class Child extends Parent

{

  public Child()

  { 

      System.out.println("This is Child");

  } 

  public static void print()

  { 

      System.out.println("print()");

  } 

  public static void main(String[] args)

  { 

      Child test1 = new Child();

      Parent temp1 = (Parent) test1;

      Child target1 = (Child) temp1;

      target1.print();

      Parent test2 = new Parent();

      Child target2 = (Child) test2;

      target2.print(); // 报错

  } 

}

输出结果:

还有不理解可以追问。

java中向上转型,向下转型,强制类型转换的原理?

向上或者向下转型

就要说到继承

比如有2个类

a

b

b继承a

b

b

=

new

b();

这个时候

a

a

=

b;

这种用法就是向上转型

使用父类的引用

引用子类对象

向上转型是自动的不需要其他操作

然后在上边的基础上

b

=

(b)a

这个就是向下转型

当用父类引用

引用子类对象

现在想不使用父类的引用

而使用子类的引用

就是向下转型

向下转型必须强制转型

必须确定对象确实是子类对象

如果是父类对象那就会报错

java多态向上转型向下转型的问题

引用a的类型是Animal,是Cat的父类。所以是“父类引用指向子类对象”。如果是“子类引用指向父类对象”,那应该写成 Cat a = new Animal();但这显然是不和逻辑的。

你说的没错——“向上转型后,父类也只能调用父类已经有的方法”。但是子类如果覆盖了父类的方法,那么即使向上转型,方法的行为也表现为覆盖后的行为。这也是多态的一种体现。向上转型更多的用来体现一种编程上的“约定”。所有继承某个类或者实现某个接口的类,一定包含某个方法,这样在调用的时候,使得你也不必关系具体的实现细节,只要知道“这个类型中的某个方法能帮我完成工作”就可以了。

向下转型,是“引用的类型”的变化,不是对象实例类型的变化。new什么,就是什么。不会因为向上或者向下转型而改变自己的类型。

最后一个问题,不管向上还是向下转型,调用的都是实际类型中的那个方法。比如,Animal a = new Cat(); a.叫()。那这个叫就是Cat类型实例中的“叫”方法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。