转型、多态、方法重写与重载

转型,多态和契约设计

类转型

  • 变量支持相互转化,比如int a = (int)3.5

  • 类型可以相互转型,但是只限制于有继承关系的类

    • 子类可以转换成父类,而父类不可以转换为子类

    • 子类继承父类的所有财产,子类可以变成父类(从大变小,即向上转型);从父类直接变成子类(从小变大,即向下转型0=)则不允许

多态

多态意味着父类型的变量可以引用子类型的对象

  • 类型转换,带来的作用就是多态

  • 子类继承父类的所有方法,这种行为就是重写(覆写,覆盖,overwrite/override,not overload(重载))

  • 子类的方法优先级高于父类

  • 在继承的前提下,子类将父类的方法重写,并将父类对象指向子类对象 Father father = new Son();

  • 多态对象使用的是父类的定义,子类的方法

  • 多态的作用

    • 以统一的接口来操作某一类中不同的对象的动态行为

    • 对象之间的解耦

例:

public class AnimalTest {
    public static void main(String[] args) {
        Animal[] as = new Animal[4];
        as[0] = new Cat();
        as[1] = new Dog();
        as[2] = new Cat();
        as[3] = new Dog();

        for (int i = 0;i<as.length;i++){
            as[i].move();
        }//这里面调用是每个元素自身的move方法,并不是Animal中的空方法

        for (int i=0;i<as.length;i++){
            haveLunch(as[i]);
        }
        haveLunch(new Cat());//Animal a = new Cat();haveLunch(a)
        haveLunch(new Dog());
        haveLunch(
                new Animal() {
                    @Override
                    public void eat() {
                        System.out.println("more and more");
                    }

                    @Override
                    public void move() {
                        System.out.println("。。。");
                    }
                }
        );//产生了一个匿名的类,需要将Animal中的方法补全,且只使用一次

    }
    public static void haveLunch(Animal a){
        a.eat();
    }

}

new一个接口的同时,必须将接口中所有的方法实现补足补全

方法重载与方法重写

方法重写

  • 子类从父类中继承方法。有时子类需要修改父类中定义的方法实现,这称为方法重写(method override)。
  • 某方法在A类中定义,A类被B类继承,在B类中将这个方法修改,那么这两个类都可以在B类中使用,B类要调用父类方法时要使用super关键字。

注意:

  1. 重写的方法必须与被重写的方法具有一样的签名,以及一样或兼容的返回类型
  2. 仅当实例方法可以访问时,它才能被重写。 私有方法只能该在类本身里面访问,该类以外的类是不能访问的
  3. 与实例方法一样,静态方法也能被继承,但静态方法不能被重写。若父类中定义的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏。可以使用语法"父类名.静态方法名"调用隐藏的静态方法

方法重写与方法重载的区别

重载意味着使用同样的名字但是不同的签名来定义多个方法。重写意味着在子类中提供一个对方法的新的实现

public class TestOverloading{
    piblic static void main(String[] args){
        A a = new A();
        a.p(10);//调用A中重载的方法,结果为10
        a.p(10.0);//调用类B中的方法,结果为20.0
    }
    
    class B{
        public void p(double i){
         System.out.println(i * 2);   
        }
    }
    Class A extend B{
        //方法重载
        public void p(int i){
            System.out.peintln(i);
        }
    }
}

A类中有两个重载方法,p(int i)和p(double i),方法p(double i )继承自类B

  • 方法重写发生在具有继承关系的不同类中,而方法重载可以发生在同一个类中,也可以发生在具有继承关系的不同类中
  • 方法重写具有一样的签名;方法重载具有同样的方法名但是有不同的参数列表

契约设计

  • Java编程设计遵循契约精神

  • 契约:规定规范了对象应该包含的行为方法

  • 接口定义了方法发名称、参数和返回值,规范了派生类的行为

  • 基于接口,利用转型和多态,不影响真正方法的调用,成功的将调用类和被调用类解耦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值