多态向下转型
多态的前提
1、要有继承的关系
2、子类要重写父类中的方法
3、要有父类的引用指向子类对象
多态的弊端:
多态无法使用子类特有的方法
class Father1{
public void fun(){
System.out.println("这是父类中的fun方法");
}
}
class Son1 extends Father1{
public void fun(){
System.out.println("这是子类中的fun方法");
}
public void show(){
System.out.println("这是子类中特有的show方法");
}
}
public class PolymorphicDemo1 {
public static void main(String[] args) {
//多态创建子类对象
Father1 f = new Son1();
f.fun();//这是子类中的fun方法(多态与成员方法的关系:编译看左,运行看右)
//需求:现在我想调用子类中特有的方法,咋办
//f.show();
}
}
需求:现在我想调用子类中特有的方法,咋办
f.show();
多态的弊端:
多态无法使用子类特有的方法
我就想使用子类特有的功能,能否使用? 能
使用子类特有功能的方法
1、创建对应的子类并调用方法
可以,但是不推荐,很多时候会占用堆内存空间
class Father2 {
public void fun() {
System.out.println("这是父类的fun方法");
}
}
class Son2 extends Father2 {
public void fun() {
System.out.println("这是子类的fun方法");
}
public void show() {
System.out.println("这是子类的show方法");
}
}
public class PolymorphicDemo2 {
public static void main(String[] args) {
Son2 son2 = new Son2();
son2.show();
2、java提我们考虑到了这一点,提供了一个技术给我们使用:向下转型
把父类的引用强制转换成子类的引用
子类类名 变量名 = (子类类名)父类的引用
class Father2 {
public void fun() {
System.out.println("这是父类的fun方法");
}
}
class Son2 extends Father2 {
public void fun() {
System.out.println("这是子类的fun方法");
}
public void show() {
System.out.println("这是子类的show方法");
}
}
public class PolymorphicDemo2 {
public static void main(String[] args) {
//多态创建子类对象(向上转型)
Father2 f = new Son2();
f.fun();
//多态中的向下转型
Son2 s = (Son2) f;
s.show();
}
}
对象之间转型的问题:
1、向上转型
其实就是多态创建对象的写法
Fu f = new Son();
2、向下转型
Son s = (Son)f;
基本数据类型之间的强转:
int a = 10;
byte b = (byte)a;
向下转型的注意事项:
要求必须是存在继承关系的
class Father2 {
public void fun() {
System.out.println("这是父类的fun方法");
}
}
class Son2 extends Father2 {
public void fun() {
System.out.println("这是子类的fun方法");
}
public void show() {
System.out.println("这是子类的show方法");
}
}
class Demo{
}
public class PolymorphicDemo2 {
public static void main(String[] args) {
Father2 f = new Son2();
Demo d = (Demo) f;//报错。Demo类与Father2类不存在继承的关系
}
}