先写文档后吐槽,先解决问题后发牢骚,我一贯的行事风格。
注:最下面有代码,可去根据我的说明除注释进行灵活测试。
1、子类转换成父类
一句话,子类的实例用父类来接收(父类的引用指向子类的实例)
代码:
补充:
前提:子类转成父类后(子类的实例赋给父类的引用后)
A):子类转成父类后(子类的实例赋给父类的引用后),如果子类重写了父类的方法,那么父类的引用默认调用的是子类的重写的方法。如果不存在重写方法,他默认调用的为父类的方法。(其实默认的是先调用了父类的方法,如果存在重写方法,就调用子类的方法,因为其将父类的方法覆盖,如果不存在,那么调用的就是父类的方法。)
即:
B):子类转成父类后(子类的实例赋给父类的引用后),因为属性不存在重写,那么父类的引用调用的为父类的属性,因为子类实例的数据类型为父类的类型。
即:
2、父类转换成子类(重点)
其实父类转换成子类有两种方式,但是第一种方式没有多大的意义。第二种方式才是重点。
A):第一种方式就是:强制转换。
(举例)即:Animal a = new Animal(); //Dog为子类,Animal为父类
Dog b = (Dog)Animal;
此种方法,编译没有什么问题,但是运行就会报错,没法应用也没有意义。具体原因不做赘述。
B):第二种方式:父类转换成子类需要前提的,这个大前提是什么呢?就是,必须要存在父类的引用指向子类的实例(即子类转换成父类)
即:Animal a = new Dog(); //Dog为子类,Animal为父类
Dog b = (Dog)Animal;
这里给大家分享一段小小的代码,以作应用:
首先介绍一下,此方法是重写了Object的equal方法来比较两个对象是否相等。
首先执行s.equals(s1);s1代表new Student();因为Object为所有类的父类,可以接收任何对象。
所以实际传入的参数为:new Student(),即Object obj = new Student();
相当于子类转换成父类的A):补充,没有重写方法默认调用的为父类的方法,
但是如果想调用子类的方法,要进行类型的转换,转换成子类即可。
为了类型的统一,防止出现异常,所以进行obj instanceOf Student 。
obj instanceOf Student的含义为new Student()属于Student的实例。成立。
此时必须进行类型的转换才可进行调用是子类的对象方法。
需要进行转换即进行Student student = (Student)obj;
说的够明白了吧,附上代码。
class Animal {
public static int age = 14;
public void eat() {
System.out.println("正在吃饭");
System.out.println("刚吃完");
}
}
class Dog extends Animal {
public static int age = 15;
private String name;
String getName() {
return name;
}
void setName(String name) {
this.name = name;
}
public void eat() {
System.out.println(getName() + "正在吃饭");
}
}
public class FZLZH {
public static void main(String[] args) {
Animal animal = new Dog();
//dog.setName("泰迪狗");
//animal.eat();
//输出null正在吃饭
//int age = animal.age;
//System.out.println(age);
//输出14
/*强制转换
* Animal animal1 = new Animal();
* Dog dog = (Dog)animal;
*/
/*第二种转换
* Animal animal1 = new Dog();
* Dog dog = (Dog)animal;
*/
}
}
开始吐槽大会:为了弄明白这个东西真的是拼上了老命,跟老师切磋了一下午,好歹弄明白了。
附上我的QQ:3030363140;验证问题除了备注随便写就OK;
有问题联系我就好了,免费答疑,哈哈,若果觉得满意,动动你的灵魂的小手,给我点个关注。