day8 面向对象编程之多态

什么是多态

多态,即方法对象具有多种状态。多态是在封装、继承之上的。

多态的具体体现

方法的多态:重载和重写
对象的多态:向上转型和向下转型
在这里插入图片描述
父类的编译类型可以指向子类的对象。

向上转型

  1. 本质:父类的引用指向了子类的对象
  2. 语法:
    父类类型 引用名 = new 子类类型(参数列表);
    
  3. 特点:编译类型看左边,引用类型看右边
    可以访问父类中的所有成员(遵守访问权限)
    不可以访问子类中独有的成员
    最终效果看子类的具体实现(有无重载,重写)。

编译类型决定该引用能够访问的成员的范围,
运行类型决定运行时的实际结果。

public class PolyObj {
    public static void main(String[] args) {
    	//向上转型
        Base base = new Sub();
        base.output();
    }
}
class Base{
    public void output(){
        System.out.println("Base");
    }
}
class Sub extends Base{
    @Override
    public void output() {
        System.out.println("Sub");
    }
}
//Sub

向下转型

  1. 为什么需要向下转型
    在向上转型之后,父类的引用无法访问子类的特有成员。若此时想要访问子类的特有成员,则对该父类类型的引用进行一次向下转型,就能够访问到子类中所有的成员。
  2. 语法:
    子类类型 引用名 = (子类类型) 父类引用;
    
  3. 特点:向下转型一定在向上转型之后
    只能强制转换父类的引用,而不能强制转换父类的对象
    要求父类的引用必须是指向当前类型的对象
    可以调用子类类型中的所有的成员
    public class PolyObj {
        public static void main(String[] args) {
        	//向上转型
            Base base = new Sub();
            base.output();
            // 向下转型
            Sub sub =(Sub) base;
            sub.SubOutput();
        }
    }
    class Base{
        public void output(){
            System.out.println("Base");
        }
    }
    class Sub extends Base{
        @Override
        public void output() {
            System.out.println("Sub");
        }
        public void SubOutput(){
            System.out.println("Sub Output");
        }
    }
    //Sub
    //Sub Output
    

属性重写

属性没有重写一说,属性由编译类型决定

public class Prop {
    public static void main(String[] args) {
    	// 编译类型是Base,属性的值由编译类型决定,所以会输出10
        Base base = new Sub();
        System.out.println(base.n);
    }
}
class Base{
    public int n=10;
}
class Sub extends Base{
    public int n=20;
}
// 结果是10

instanceof 关键字

判断对象的运行类型是否是XX类型及其子类类型,返回值是boolean类型
用法:

对象 instanceof 类型;

举例:

public class Prop {
    public static void main(String[] args) {
        Sub sub = new Sub();
        System.out.println(sub instanceof Base);
        System.out.println(sub instanceof Sub);
    }
}
class Base{ }
class Sub extends Base{ }
//true
//true
public class Prop {
    public static void main(String[] args) {
        Base base = new Sub();
        System.out.println(base instanceof Base);
        System.out.println(base instanceof Sub);
    }
}
class Base{ }
class Sub extends Base{ }
//ture
//false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值