本文目录一览:
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类型实例中的“叫”方法。