<span>Java转型,多态和契约设计</span>
类转型
-变量支持互相转化,例如 int a=(int) 3.5;
-类型可以互相转型,但是只限制于有类型关系的类。
-子类可以转换成父类,而父类不可以转换成子类
-子类可以继承父类所有资产,子类可以变成父类(从大到小,即向上转型);从父类直接变成子类(从小到大,即向下转型)则不允许。
//Man 是 HuMan 的子类
Human obj1=new Man();//Ok, Man excends HuMan
Man obj2=new HuMan();//illegal,Man is a derived class HuMan
父类转化为子类有一种情况例外,就是这个父类本身就是从子类转化过来的。
//Man 是 HuMan 的子类
Human obj1=new Man();//Ok, Man excends HuMan
Man obj2=new HuMan();//Ok,because obj1 is born from Man class
eg:
public interface Human()//定义了一个Human接口
{
public void eat();
public void plough();
}
public class Man extends Human()//类Man继承了Human接口
{
public void eat()
{
System.out.println("I can eat more!");
}
public void plough()
{
}
public static void main(String[] a)
{
Man obj1=new Man();
obj1.eat();//call Man.eat();
Human obj2=(Human) obj1;//子类转父类,向下转型
obj2.eat();//call Man.eat();
Man obj3=(Man) obj2;//特殊条件下的子类转父类
obj3.eat();//call Man.eat();
}
}
多态
-类型转换,带来的作用就是多态。
-子类继承父类的所有方法,但子类可以重新定义一个名字,参数和父类一样的方法,这种行为就是重写(覆写/覆盖 overwrite/override),不是重载(not overload)。
-子类方法的优先级是高于父类的。
多态的作用:
- 以统一的接口来操纵某一类中不同的对象的动态行为。
- 对象之间的解耦。
-多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
-对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。
-Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
契约设计
-Java编程设计遵循契约精神
-规定规范了契约应该包含的契约应该包含的行为方法
-接口定义了方法的名称,参数和返回值,规范了派生类的行为。
-基于接口,利用转型和多态,不影响真正方法的调用,成功的将调用类和被调用类解耦。
总结
- 子类可以转父类,父类不可以转子类(除非父类对象本身就是父类)
- 子类转型为父类后,调用普通方法,依旧是子类的方法。
- 契约设计,类不会直接使用另外一个类,而是采用接口的形式,外部可以“空投"这个接口下的任意子类对象。