一、向上转型
基本语法
父类类型 引用名 = new 子类类型();
特点
- 等号”=“ 左边的类型是编译类型,右边的类型是运行类型
- 创建之后的对象可以调用父类的所有成员(成员属性和成员方法),调用的方法和属性由编译类型决定,不能调用子类特有的方法
- 最后在执行方法时,由运行类型中查找相应的方法
- 最终的运行效果看子类的具体实现
代码示例演示
父类
public class Animal {
String name = "动物";
int age = 10 ;
//四种方法
public void sleep(){
System.out.println("睡");
}
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
public void show(){
System.out.println("Hello 你好");
}
}
子类
public class Cat extends Animal {
public void eat(){
System.out.println("猫吃鱼");
}
//子类特有的方法
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
测试类
public class PolyDetail {
public static void main(String[] args) {
//向上转型
Animal animal = new Cat();
animal.eat();
}
}
运行结果
二、向下转型
基本语法
子类类型 引用名 = (子类类型)父类引用;
向下转型的本质与基本数据类型的强转类型有异曲同工之妙
注意点
- 向下转型 只能强转父类的引用(上面的animal),不能强转父类的对象(Animal)
- 要求父类的引用必须指向的是当前的目标类型,也就是说在进行向下转型的时候,父类的引用必须在之前指向过目标转型的子类类型
Animal animal = new Cat();//这个是前提
才能进行下面 Cat cat = (cat) animal;- 当向下转型之后,可以调用子类类型中的所有成员
子类类型同样可以调用父类的方法,因为子类继承了父类
代码示例演示
public class PolyDetail {
public static void main(String[] args) {
//向上转型
Animal animal = new Cat();
animal.eat();
//向下转型
Cat cat = (Cat) animal;
cat.catchMouse();
cat.run();
cat.show();
}
}
运行结果
三、属性重写的问题
属性是没有重写的说法的
属性的取值是看编译类型的
代码示例演示
package com.ylxstudy.ploy_.detail_;//包名
public class PolyDetails02 {
public static void main(String[] args) {
//向上转型
Base base = new Sub();
System.out.println(base.count);//输出base 的count
Sub sub = new Sub();
System.out.println(sub.count);//输出sub 的count
}
}
class Base{
int count = 10;
}
class Sub extends Base{
int count = 20;
}
四、instanceOf
instanceOf比较操作符,用于判断对象的类型,这里的对象指的是运行类型,判断是不是为XX类型或者是XX类型的子类
代码示例演示
package com.ylxstudy.ploy_.detail_;
public class PolyDetails02 {
public static void main(String[] args) {
//向上转型
Base base = new Sub();
//此时 base 的运行类型是 Sub ,Sub 继承了 Base
//base 的 运行类型 是否为 Base 或者是 Base的子类
System.out.println(base instanceof Base);//true
//base 的 运行类型 是否为 Sub 或者是 Sub的子类
System.out.println(base instanceof Sub);//true
}
}
class Base{
int count = 10;
}
class Sub extends Base{
int count = 20;
}
运行结果
五、总结
以上就是今天要讲的内容,本文介绍了 向上转型 、向下转型、属性的重写问题和instanceOf 的使用。