zoukankan      html  css  js  c++  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

  • 相关阅读:
    MySQL中表的基本操作1
    MySQL在表中加入记录
    GDB基本命令(整合)
    (转载)Linux的epoll模型
    不做采购,不知道销售有多蠢
    我的创业体会和大公司的做事比较
    需求问题排查
    我的创业体会和大公司的做事比较
    不同技术团队的配合问题及DevOps(不错的文章,来自infoq)
    不同技术团队的配合问题及DevOps(不错的文章,来自infoq)
  • 原文地址:https://www.cnblogs.com/shuaixianbohou/p/3887347.html
Copyright © 2011-2022 走看看