向上转型和线下转型
2018-11-13 本文已影响0人
java4j
概念
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口。
向下转型:父类引用的对象转换为子类类型称为向下转型。
向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
向下转型时,如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。如果父类引用的对象是父类本身或者其它子类,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。
例子
public class Person {
protected String name = "Person";
public void printName() {
System.out.println(name);
}
public void print() {
System.out.println(name);
}
}
public class Woman extends Person {
private String name = "Woman";
@Override
public void printName() {
System.out.println(name);
}
public void say() {
System.out.println("Woman say");
}
public static void main(String[] args) {
// 向上转型
Person p = new Woman();
// 输出父类的成员变量的值,注意不是子类的
System.out.println(p.name);
// 调用子类的方法,输出子类的成员变量
p.printName();
// 不能调用子类存在而父类不存在的方法
// p.say();
// 调用父类的方法,这个方法也被继承到子类中去了
// 但是输出的却是父类的成员变量
p.print();
// 没有向上转型的话,输出的也是父类成员变量的值
Woman w = new Woman();
w.print();
}
}
输出:
Person
Woman
Person
Person
另外一个例子:
class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
@Override
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
public class Demo {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
// A and A
System.out.println("1--" + a1.show(b));
// A and A
System.out.println("2--" + a1.show(c));
// A and D
System.out.println("3--" + a1.show(d));
// 这里需要注意,B and A
System.out.println("4--" + a2.show(b));
// 这里需要注意,B and A
System.out.println("5--" + a2.show(c));
// A and D
System.out.println("6--" + a2.show(d));
// B and B
System.out.println("7--" + b.show(b));
// 这里选择的是show(B obj)方法,而不是show(A obj)方法
// B and B
System.out.println("8--" + b.show(c));
// 这里需要注意,A and D
System.out.println("9--" + b.show(d));
}
}