Java学习笔记68——多态向下转型

多态向下转型

多态的前提

​ 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类不存在继承的关系

    }
}
上一篇:Netty入门(NIO编程和Netty客户端服务端示例)


下一篇:Swift - 计算文本高度