概念
向上转型:一般为父类引用指向子类对象,父类引用可以调用子类重写或者未重写的方法,但是不能调用子类的特有方法,调用的属性为父类的属性。
Animal a=new Dog();
castClass(a,a.name);
向下造型:一般为子类引用指向父类对象,但是父类对象一般为本子类的向上转型,否则会出现classcastEException异常,此异常一般为子类的引用直接指向了父类的对象。
//向下转型报错
Dog d= (Dog) new Animal();
d.eat("测试")
意义:当一个方法在子类中进行重写的时候,调用不同的子类可能需要new对象很多次,再调用对应的方法,会出现很多的代码重复,对于代码结构来说很不好看。
/**
* @author lsd
* 向上和向下造型的理解
*/
package com;
public class TestExtends {
public static void main(String[] args) {
// castClass(new Mammal());
// castClass(new Dog());
/**
* 向上造型也叫作向上转型,也叫作父类引用指向子类的对象,向上造型可以调用父类中子类重写的方法,
* 子类的特有方法不能调用,调用的属性为父类的属性,
*
*/
Animal a=new Dog();
castClass(a,a.name);
// a.see(); 报错
/**
* 向下造型一般是采用了向上造型之后才会采取向下造型,一般为同类型兑现改的转型
* Animal直接转型为Dog,编译不会报错,运行是会报错为classcastException
* 即类型转换异常,向下造型调用的为本身的属性
*/
Dog b=(Dog)a;
castClass(b,b.name);
//向下转型报错
Dog d= (Dog) new Animal();
d.eat("测试");
}
static void castClass(Animal a,String name){
a.eat(name);
}
}
class Animal {
public String name="animal";
public void eat(String name) {
System.out.println("动物吃东西!"+name);
}
}
class Mammal extends Animal {
public String name="mammal";
@Override
public void eat(String name) {
System.out.println("哺乳动物吃东西"+name);
}
public void see(){
System.out.println("狗看东西");
}
}
class Dog extends Animal{
public String name="dog";
@Override
public void eat(String name) {
System.out.println("狗吃东西"+name);
}
}