转型,多态和契约设计
类转型
-
变量支持相互转化,比如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关键字。
注意:
- 重写的方法必须与被重写的方法具有一样的签名,以及一样或兼容的返回类型
- 仅当实例方法可以访问时,它才能被重写。 私有方法只能该在类本身里面访问,该类以外的类是不能访问的
- 与实例方法一样,静态方法也能被继承,但静态方法不能被重写。若父类中定义的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏。可以使用语法"父类名.静态方法名"调用隐藏的静态方法
方法重写与方法重载的区别
重载意味着使用同样的名字但是不同的签名来定义多个方法。重写意味着在子类中提供一个对方法的新的实现
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编程设计遵循契约精神
-
契约:规定规范了对象应该包含的行为方法
-
接口定义了方法发名称、参数和返回值,规范了派生类的行为
-
基于接口,利用转型和多态,不影响真正方法的调用,成功的将调用类和被调用类解耦