泛化就是抽象化,把具体的事物当作抽象的东西看待(把猫看成动物)。 泛化也叫向上转型,是通往多态的路口。
把子类对象看作父类对象,这样可行吗? 可行,自愿放弃了更丰富的信息。
这样做有用吗? 有用,我们可以用同样的类型处理不同的东西
注意:只有向上转型,没有向下转型。向下转型叫做强转,这样做很不安全!
注意:泛化指的是引用的泛化,不是对象的泛化,内存中的对象还是原来的对象,只是把引用的类型给改变了。
(1)多态的概念 多态(Polymorphism)按字面的意思就是“多种状态”。 在面向对象语言中,接口的多种不同的实现方式即为多态。 简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
(2)多态的分类 Java中的多态,可以分为静态多态和动态多态。 静态多态就是指方法的重载。 动态多态是指“动态绑定”。而我们这里所说的多态,大多数是指动态多态。
(3)多态应该具备的条件 1.继承或者接口 2.子类重写父类方法 3.父类引用指向子类对象(泛化)
(4)动态绑定 所谓动态绑定,是指在编译期不能确定引用指向什么类型,而是在运行期选择具体的类型。
public class Animal{ String name; public Animal(){ } public void eat(){ } public void sayHello(){ } } public class Cat extends Animal{ public void eat(){ } public void sayHello(){ } } public static void main(String[] args){ Animal c = new Cat; c.eat();//动态绑定---绑定的是Cat类中重写的eat方法 }总结 多态中成员方法的访问特点:编译看左边,运行看右边
(5)静态绑定 静态绑定是指编译期就确定调用的是父类中的成员。 静态不是针对类中的普通方法,而对于成员变量,静态变量,静态方法,private修饰的方法,采用的是静态绑定。
Animal c = new Cat(); c.eat(); //动态绑定 System.out.println(c.name); //静态绑定 c.sayHello(); // 静态绑定总结: 成员变量、静态方法、静态变量、私有变量等采用静态绑定 编译看左边,运行看左边
(6)多态带来的好处 提高了代码的维护性(继承保证) 提高了代码的可扩展性(多态保证)
用abstract关键字修饰的方法,称为抽象方法 抽象方法的特点,只有方法声明,没有方法体 抽象方法的作用:被子类重写,为子类规定类方法的调用格式,具体操作内容等待子类区完成
至少包含一个抽象方法的类叫抽象类。(用abstract修饰) 抽象类的特点: 抽象类不能被实例化。 抽象类唯一的作用就是被子类继承 继承抽象类的类,有责任去实现抽象类中的所有抽象方法。如果不实现,那么子类也必须声明为抽象类 抽象类中可以包含非抽象方法。
抽象类表达共性,提供了可被继承的范本,标准的制定者。 抽象方法也是表达共性,为多个继承类提供方法的调用格式规定。
1、抽象类不能创建对象,那么抽象类中是否有构造方法? 抽象类中一定有构造方法。主要为了初始化抽象类中的属性。通常由子类实现。
2、final和abstract是否可以同时修饰一个类? 一定不能同时修饰。因为:抽象类的作用就是被继承,而final修饰的类不能被继承
接口是虚而又虚的类,它只有方法的形式描述,没有任何实际内容。 可以声明实现了多个接口,接口是多重继承的替代品。
1、接口不能被实例化 2、接口用来被类实现 3、接口中可以定义属性和方法: 接口中的所有属性 默认的修饰符是 public static final,所以定义时必须赋值。 接口中的所有方法 默认的修饰符是 public abstract 4、接口没有构造方法
(1)接口的定义 格式
interface 接口名{ 属性 抽象方法 }(2)实现接口 格式
类名 implements 接口{ 实现接口中的方法 }当一个类实现某个接口时,类中要对接口中的所有方法进行实现(添加方法体,完成方法)
一个类只能继承一个父类,但能同时实现多个接口。 格式
class 类名 extends 父类名 implements 接口1,接口2,……{ //类的成员 }格式
子接口 extends 父接口1,父接口2,...{ } public interface Inter3 extends Inter1,Inter2{ }1.能用接口的地方,不用类。(面向接口编程) 2.一个模块尽量少知道其它模块的信息,知道的越少,对今后的维护越有利。
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法。 接口中不能含有普通方法,而抽象类中可以存在普通方法。 一个类只能继承一个抽象类,而一个类却可以实现多个接口。