向上转型和向下转型(强转) 总结

本文解析了向上转型(父类引用子类对象)的语法、特点,强调了方法调用中重写与编译类型的区别。同时,深入探讨了向下转型(子类引用父类对象)的语法和其对方法、属性调用的影响。重点在于理解对象行为的动态性与继承层次的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

向上转型:
  1. 本质:父类引用指向了子类的对象
  2. 语法:父类类型 引用名 = new 子类类型();
  3. 特点:编译类型看左边,运行类型看右边
    可以调用父类中的所有成员(需访问权限)
    不能调用子类特有的成员;
    最终运行效果看子类的具体实现!

方法的调用:

public class OuterClass{

        public static void main(String args[])
        {
            A a = new B();          //父类引用指向子类对象
            a.print();              //输出结果:B:print
        }
}
class A {
    public void print() {
        System.out.println("A:print");
    }
}

class B extends A {
    int x=5;
   public void print() {
        System.out.println("B:print");
    }
}

         并且 此时如果子类中没有重写父类的方法,那么会直接调用父类的方法;另外如果是子类特有方法,是无法调用的。
通俗点讲,对象.方法,能.什么方法是左边编译类型决定的,也就是父类决定的,而具体效果,是先由右边的运行类型决定,也就是子类决定。

属性的调用:
         刚刚主要讲的是方法的调用,是体现出来了方法的重写的,那么调用属性呢?

public class OuterClass {

    public static void main(String args[]) {
        A a = new B();          //父类引用指向子类对象
        System.out.println(a.x);//结果: 3
    }
}

class A {
    int x = 3;
}

class B extends A {
    int x = 5;
}

        经过实验发现这里并没有调用子类的属性,可以发现属性是没有重写之说的,属性的值看编译类型,也就是由“=”左边的类型决定。如果父类没有这个属性,子类有,那等于没有,是直接报错的!‘’

向下转型:
  1. 语法:子类类型 引用名 = (子类类型) 父类引用;
  2. 特点:只能强转父类的引用,不能强转父类的对象
    要求父类的引用必须指向的是当前目标类型对象
    当向下转型后,可以调用子类类型中的成员
public class OuterClass {
    public static void main(String args[]) {
        A a = new B();          //父类引用指向子类对象
        B b = (B)a;             // 向下转型
        System.out.println(b.x); // 这里输出父类的方法,子类里没有的方法,在父类中找到
        b.print();//子类有这个属性,输出子类的属性
        b.my();//可以调用子类独有的方法了
    }
}

class A {
    int x = 3;
    public  void print(){
        System.out.println("A:print");
    }
}

class B extends A {
    int x = 5;

    public  void my(){
        System.out.println("这是子类独有的方法");
    }
}

       可以看到,向下转型后的对象,无论是调用方法,还是属性,都是从子类出发了,找不到,再去父类找,
       注意点:

        A aa = new A();
        B bb =(B)aa; //这是错误的,不能强转父类的对象
        /*假设还有个C类也继承了A类*/
        A aaa = new C();
        B bbb =(B)aaa; //这样也是错的,因为aaa并不是指向当前子类(B)的引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值