在程序设计中,多态性是指一个名词可以有多种语义。在OOP中,多态不仅指这一种情况,还与类密切相关。同一类的所有对象在收到同一条消息时,将采用同样的动作;而不同类的对象在收到同一消息时,可能采取不同的动作。利用多态可以使系统具有更好的可扩充性。 Java中的多态性主要通过继承中的覆盖(动态绑定)和方法的重载(静态绑定)来实现。
子类自然继承父类中所定义的非private的成员变量和普通方法,唯有构造方法例外。
继承一般有多重继承和单一继承两种方式。在**单一继承** 中,每一个类最多只有一个父类,而**多重继承**可以有两个或两个以上的父类。Java不能直接使用多重继承,在某些特殊情况下,需要使用**接口**来实现。子类的成员变量和父类的同名,称为父类的成员变量(属性)被隐藏;如果是成员方法同名,称父类的成员方法被覆盖。
概括:子类变量可以修改继承下来的父类变量的任何属性,使用子类对象是,以修改之后的属性为准。
子类中,如果继承下来的方法不能满足自己的要求,可以将其重写一遍,称为“覆盖”。覆盖必须满足以下两个条件:
- 方法名称必须相同 - 方法的参数必须完全相同,包括参数的个数、类型和顺序。只满足第一条,不满足第二条,就不是覆盖,是重载。
Java规定只有父类变量可以引用它的直接或间接子类对象。。反之,子类变量不可引用他耳朵祖先对象,即使采用强制类型转换,能通过编译,运行时也会出错。
//------文件名Base.java------ public class Base{ public Base(){System.out.println("Base construct.");} } //------文件名Derived.java------ public class Derived extends Base{ public Derived(){ System.out.println("Derived construct."); } public static void main(String[] args){ Base oa = new Derived();//父类变量引用子类对象,成功 Derived ob; oa=new Base(); ob=(Derived)oa;//强制转换再引用,编译可以通过,但是运行报错 } }子类的变量和方法可以和父类的同名,在这种情况下,父类中的同名成员就被屏蔽起来了(不是清除)如果在子类中想要访问父类的成员,要用到super关键字。
super一般用法: super.变量名 或 super.方法名([参数列表]) 使用super调用父类的构造方法 super的一般用法如下: super([参数列表])//注意super只能在子类中用于调用父类的成员或构造方法。 使用时必须遵守的规则—— 它只能用在构造方法中。 它只能是第一条执行语句。 一个构造方法中只能有一条super语句。注意:一旦显示地用super调用父类的构造方法,系统就不会再自动调用父类无参的构造方法啦 实际上,如果如果程序员不在子类的构造方法中写入super()或者this()这样的语句,系统会自动在第一行添加一条super()语句。
Java不允许用类直接实现多重继承,转而用接口来实现这一机制。接口需要用到interface关键字来定义,由成员属性和成员方法两部分构成。
接口最终是要用类来实现的。类对接口的继承称为接口的实现。使用关键字implements。一般形式如下:
[类修饰符] class 类名 [extends 父类名][implements 接口名1 [,接口名2,...]]{ //实现接口中的抽象方法 public [返回值类型] 方法名([参数表]){//访问权限只能是public //方法体 } }Java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载。编译器会根据实际情况来挑选正确的方法。如果编译器找不到匹配的参数,或者找出多个可能的匹配,会产生编译错误,这个过程称为重载解析。
普通方法的重载: 当方法同名时,为了让编译器区别他们,至少需要下面之一不同: 1.参数个数不同; 2.对于位置上的参数类型不同;注意:不允许参数完全相同而只是返回值不同的情况出现。
另外,访问权限修饰符以及final修饰符对于重载没有影响。
只有在同一个类里面的同名方法才能称为重载,“同一类里面”包括该类从祖先那里继承下来的方法。
构造方法的重载:为了避免错误,务必定义一个不带参的构造方法。