今天在回顾 Java 知识的时候碰到了这个知识点,正好重新巩固一下。
在面向对象编程中,因为子类与父类存在继承关系,所以对象类型存在着转换,包括向上类型转换和向下类型转化。
1.向上类型转换是指将子类对象的引用转化为父类对象的引用,用个例子说明一下:
//父类:
public class ParentClass {
public void print() {
System.out.println("父类方法");
}
}
// 子类
public class ChildClass extends ParentClass{
public void print() {
System.out.println("子类方法");
}
public void childMethod() {
System.out.println("只在子类中定义的方法 ");
}
public static void main(String[] args) {
ParentClass p = new ChildClass();
p.print();
}
}
输出结果为:
子类方法
也就是子类的 print() 方法重写了父类的方法,所以输出的是子类的 print()
“子类对象的引用转化为父类对象的引用” 这句话
等号右边new ChildClass()就是子类对象的引用
将等号右边的东西赋值给等号左边,就是转化为父类对象的引用
这样应该明白这句话了吧
当我们在写 p. 什么东西的时候,编辑器自动弹出的只有 print()这个方法,而没有childMethod()这个方法,所以,这个向上类型转换的意思就是子类向上类型转化成父类的对象,如果子类重写了父类的方法,输出结果是子类重写的方法,如果父类中没有的方法,而在子类中存在的方法是不可以调用的,归根结底一句话,父亲有的东西你才能调用,父亲给你留下的你怎么修改是你的事
2.向下类型转换是指将父类对象的引用转化为子类对象的引用
直接看例子吧,对比着向上类型转换理解
// 父类
public class ParentClass {
public void print() {
System.out.println("父类方法");
}
}
// 子类
public class ChildClass extends ParentClass{
public void childMethod() {
System.out.println("只在子类中定义的方法 ");
}
public static void main(String[] args) {
ParentClass p = new ChildClass(); // 这里是向上类型转换
p.print();
ChildClass c = (ChildClass)p; // p本来是父类对象的引用,现在我要做的是向下类型转换,所以,强制把父类对象的引用转化为了子类对象的引用
c.print();
c.childMethod();
}
}
输出结果:
父类方法
父类方法
只在子类中定义的方法
再说明一下 向下类型转换:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用类型
有的同学问了,问啥不直接这样写:
ChildClass child = new ParentClass();
问的好,因为,我们并不能保证子类的方法父类一定有是吧,所以要按照上面的例子那样写。