您的位置:

java向下转型类型转换的问题(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类型实例中的“叫”方法。

java向下转型类型转换的问题(java向下转型类型转换的问

2022-11-10
java类型转换,Java类型转换错误

2022-11-27
java向上转型,java向上转型有什么用

2023-01-03
java类型转换疑惑(java在什么情况下会发生自动类型转换

2022-11-14
java向上转型,java向上转型的employee

2023-01-03
java转换类怎么写,java怎么转换类型

2022-11-26
java中的date转型问题(java date转换)

2022-11-16
java类型转换,java类型转换的优先级

2023-01-07
java集合类型转换错误问题(java集合类型转换错误问题有

2022-11-15
解密java中的类型转换问题(java中各种类型之间的转换)

2022-11-14
java类型强制转换,java自动类型转换

2023-01-07
java强制类型转换,Java强制类型转换int转float

2023-01-05
java个人笔记之多态转型(java多态向上转型)

2022-11-14
java中类型转换那种性能最优(java中各种类型之间的转换

2022-11-10
php转java类型,php数据类型转换

2022-11-23
Java类型转换

2023-05-11
java数据类型转换,java数据类型转换的规则

2023-01-07
java子类与父类的类型转化(java父类和子类转换)

2022-11-15
java基础转向jsp(java接口向上转型)

本文目录一览: 1、如何从java返回数据到jsp页面 2、怎样可以从java类中返回到JSP页面(注意不是从action中返回) 3、有java基础,学习jsp需要JavaScript和Servle

2023-12-08
php的数据类型自动转换对in(php强制转换数据类型)

2022-11-12