首页 > 代码库 > Java面向对象㈡ -- 继承与多态
Java面向对象㈡ -- 继承与多态
Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口)。
Java继承有一个关键字super是用来指向父类。Java继承衍生出覆盖的概念。覆盖被用来支持多态。
实际开发中Java通常继承于抽象类,实现于接口。如果不希望一个类被继承,或者一个方法被覆盖,或者一个成员变量被改变,就可以用final修饰。
这里只说明两个问题:
1,重载和覆盖的区别
重载和覆盖的区别:
重载发生在同一个类之中,重载要求函数名相同,参数不同(参数个数||参数类型||参数顺序)。特别的函数的返回类型不影响重载。
覆盖发生在父子类之间,覆盖同样要求函数名相同,并且参数也相同。覆盖遵循“两同两小一大”的原则。
两同是即是函数名和参数是相同的;两小是抛出的异常更小或相同,返回类型更小或相同;一大是访问权限更大或相同。
构造函数和静态方法支持重载,但是不可以被覆盖。(构造方法和static的相似性,也可以联系到private和final关键字也有此相似性)
2,抽象类和接口的区别
在设计理念上,一个类只能继承一个抽象类,但是可以实现多个接口。抽象类和子类的关系是is a,而接口则是like a。这样抽象类含有构造方法,而接口是没有构造方法的。
抽象类可以含有普通成员变量和非抽象的方法,而接口的成员变量和方法都有固定的修饰。即:public static final 和 public abstract。对于继承者来说,抽象类的方法子类可以不全部复写,但是接口的方法抽象类是必须全部复写的。
抽象类也可以implements接口,可以实现接口中的方法,也可以不实现。抽象类不可以被final修饰。抽象类可以包含非抽象方法。
Java的多态实现在继承的基础上,多态就是父类引用指向子类对象。多态的实现依靠于子类的覆盖父类方法。因为覆盖是动态绑定,是受RTTI约束的。RTTI(run time type identification,运行时类型检查)。
这里需要提到一个隐藏的概念,子类继承父类时,在子类可以覆盖父类的方法的情况下,子类对父类的属性和静态类型,是不支持覆盖的。这里仅仅只能理解为隐藏。隐藏并不是覆盖。
class Fu{ int i = 1; static String name = "name ... fu"; static void say(){ System.out.println("say ... fu"); } void listen(){ System.out.println("listen ... fu"); }}public class Demo1 extends Fu{ int i = 2; static String name = "name ... zi"; static void say(){ System.out.println("say ... zi"); } void listen(){ System.out.println("listen ... zi"); } public static void main(String[] args) { Fu f = new Demo1(); System.out.println(f.i); f.say(); f.listen(); }}
输出:
1
say ... fu
listen ... zi