随笔 - 402  文章 - 1 评论 - 20 阅读 - 113万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

向上转型:

  将子类对象看作是父类对象;

  解释:平行四边形是四边形的一种,那么就可以将平行四边形对象看作是一个四边形对象。例如:鸡是家禽的一种,而家禽是动物中的一类,那么也可以将鸡对象看作是一个动物对象。

复制代码
package ten;
class Quadrange{//四边形类
    public static void draw(Quadrange q){//四边形类中的方法
    }
}
public class Parallelogram extends Quadrange{//平行四边形类,继承了四边形类
    public static void main(String[] args){
        Parallelogram p=new Parallelogram();//实例化平行四边形类对象引用
        draw(p);//调用父类方法
    }
}
四边形类存在一个draw()方法,它的参数是Quadrange(四边形类)类型,而在平行四边形类的主方法中调用draw()时给予的参数类型是Parallelogram(平行四边形类)类型的。这就相当于“Quadrange obj=new Parallelogram();”就是把子类对象赋值给父类类型的变量。
试想一下正方形类对象可以作为draw()方法的参数,梯形类对象同样也可以作为draw()方法的参数,如果在四边形类的draw()方法中根据不同的图形对象设置不同的处理,就可以做到在父类中定义一个方法完成各个子类的功能,这样可以使同一份代码毫无差别地运用到不同类型之上,这就是多态机制的基本思想。
复制代码

 向下转型:

  将抽象类转换为较具体的类,这样的转型通常会出现问题,例如,不能说四边形是平行四边形的一种、所有的鸟都是鸽子等。可以说子类对象总是父类的一个实例,但父类对象不一定是子类的实例。

复制代码
package ten;
class Quadrange{
    public static void draw(Quadrange q){
        }
}
public class Parallelogram2 extends Quadrange {
    public static void main(String[] args){
        draw(new Parallelogram());//将平行四边形对象看作是四边形队形,称为向上转型操作
        //向下转型
        Quadrange q=new Parallelogram();
        //Parallelogram p=q;将父类对象赋予子类对象,这种写法是错误的
        Parallelogram p=(Parallelogram) q;//将父类对象赋予子类对象,并强制转换为子类型,这种写法是正确的
    }
}
//备注:如果将父类对象对象直接赋予子类,会发生编译错误,因为父类对象不一定是子类的实例,例如:一个四边形不一定就是指平行四边形,它也许是梯形,也许是正方形等。
复制代码

备注: 当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生 ClassCastException异常,所以在执行向下转型之前,先要判断父类对象是否为子类对象的实例。这个判断通常使用instanceof操作符来完成。

  myobject instanceof ExampleClass

  myobject:某类的对象引用;ExampleClass:某个类

  使用instanceof操作符的表达式返回值为布尔值。如果返回值是true,说明myobject对象为ExampleClass的实例对象反之。

  

复制代码
package ten;
class Quadrangle{
    public static void draw(Quadrangle q){    
    }
}
class Square extends Quadrange{    
}
class Anything{    
}
public class Parallelogram3 extends Quadrange {
    public static void main(String[] args){
            Quadrange q=new Quadrange();//实例化父类对象
            if(q instanceof Parallelogram3){
                Parallelogram3 p=(Parallelogram3) q;//向下转型操作
            }
            if(q instanceof Square){
                Square s=(Square) q;
            }
            //System.out.println(q instanceof Anything);
    }
}
复制代码

 

  

posted on   chamie  阅读(382)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示