java契约_Java核心技术(初阶)知识点复习——[5]转型、多态、契约设计

1.类转型

基本类型的相互转型;

对象类型的相互转型只限制于有继承关系的类,且仅限于向上转型(由子类变成父类);

父类转为子类只有一种情况例外,即父类本身就是子类转化过来的(见下面的代码);

1 Human obj1 = new Man();//可以,因为man继承于Human

2 Man obj2 = (Man) obj1;//可以,因为obj1本身起源就是来自Man

注:至于这种向下转型在什么情况下使用,有什么意义等碰到了我再回来补充⑧!

(目前推断是为了【实现接口方法的多态性】:定义接口类数组时向上转型,调用某一实例的方法时向下转型,以便使用有方法体的方法)

2.多态

类转型带来的作用就是多态;

作用为:1)可以以统一的接口来操纵某一类中不同的对象的动态行为;

2)可以实现对象间的解耦;

子类方法的方法名、形参和父类一样,但子类方法的优先级高于父类;

1 public classHuman{2 public voideat(){3 system.out.println("I can eat");4 }

5 }

1 public class Man extendsHuman{2 public voideat(){3 System.out.println("I can eat more");4 }5 public voidplough(){6 Sysytem.out.println("I can also plough")7 }8

9 public static voidmain(String[] args){10 Man obj1 = newMan();11 obj1.eat(); //call Man.eat();12 Human obj2 =(Human) obj1;13 obj2.eat();//call Man.eat();!!!从内存上来理解!!!向上转型只是把原来内存空间的一部分数据遮盖住14 Man obj3 =(Man) obj2;15 obj3.eat(); //call Man.eat();16 }17 }

如果这时候来测试一下,会发现这三者实际上只想的是同一块内存,所以只是临时把一部分数据遮盖住了;

1 public static voidmain(String[] args){2 System.out.println(obj1 = obj2); //true

3 System.out.println(obj1 = obj3); //true

4 System.out.println(obj3 = obj2); //true

5 }

3.契约设计——基于多态性的设计思想

[1]接口规定规范了对象应该包含的行为和方法,即接口定义了方法的名称、参数、返回值;规范了派生类的行为;

[2]基于接口,利用转型和多态,不影响真正方法的调用,成功将调用类和被调用类解耦(decoupling);

1 public interfaceAnimal{2 publiceat();3 }

public classAnimalTest{public static voidhaveLunch(Animal a){

a.eat();

}

havelunch(new Cat());//隐含一个向上转型:Animal a = new Cat();

}

[3]综上,基于契约设计,类不会直接使用另外一个类,而是采用接口形式,外部可以“空投”这个接口下的任意子类对象(此时默认实现了一个向上转型过程)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值