美文网首页
聊聊继承、多态和抽象

聊聊继承、多态和抽象

作者: AnLLiang | 来源:发表于2016-07-16 10:36 被阅读0次

    想了很久,简书的第一篇文章写些什么好,自己是个技术小白,讲不了什么高深的技术,那就来聊聊我所认知的一些JAVA技术知识。

    继承


    Java是面向对象程序设计语言。(什么是面向对象,在这里就不唠叨了),而Java程序是什么?就是通过继承、组合对象形成的一套问题解决方案。通过继承可以纵观JAVA语言的所有特性。
    继承是面向对象编程技术的基石(将复杂问题简单化)。也是后面所要讲的多态和抽象的前提。通俗来讲,继承是一个对象从另一个对象获取属性的过程(除了private属性以外),类之间就形成了所谓的等级关系。
    继承有以下几个特点:

    • 单一继承(解决了谁是“母亲”的问题)
    • IS-A问题(解决了继承和组合的问题)
    • Java所有类都隐式继承Object基类;
    • extends 与 Implement关键词

    多态


    什么是多态?同一种行为具有不同表现形态或者形式的能力这是官方的解释,听起来一头雾水。我的理解是:多态是对象的多种表现形式,即向上转型。
    多态的前提是:

    • 继承
    • 动态绑定

    有人问什么是动态绑定,《Java编程思想》给出这样的解释:

    在在运行时根据对象的类型进行绑定,而与之相反的是前期绑定,编译时就确定类型。>

    有人又问,Java不是动态编程语言,怎么实现动态绑定呢?这是Java语言的一个特点——反射机制(后续更新文章会讲述)

    看栗子:

    public class Animal{
        public Animal(){
        }
        public void move(){
            System.out.println("Animal move");
        }
    }
    
    public class Dog extends Animal{
          public String name;
          public Dog(String name){
                this.name=name;
          }
          public void move(){
               System.out.println(name+"move");
          }
          public void eat(){
                System.out.println(name+"eat");
          }
    }
    public class Test{
        public static void main(String[] args){
              Animal dog1=new Dog("dog1");
              dog1.move();
              //dog1.eat();错误
              Dog dog2=new Dog("dog2");
              dog2.move();
              dog2.eat();
        }
    }
    

    执行以上程序,输出结果为:
    dog1.move;
    dog2.move;
    dog2.eat;

    • 为什么Animal对象 dog1 输出的是dog1.move,而不是Animal.move,这是因为JAVA语言在运行的时候才确定dog1所指向的对象是Dog,Dog向上转型为Animal

    • dog1引用依旧是Animal,Animal是没有eat()方法的,所以dog1.eat()无法调用。记得前面继承所讲的么,dog1 IS-A Animal,但Animal is not a Dog。

    抽象


    抽象类,我的理解是,无法创建具体对象的类是抽象类,抽象类只是一个特殊的类,既然是JAVA中的类,那么就具有其所有的特点:继承、多态、重写重载等;

    作用:

    • 逻辑接口与实现分离,结构化;
    • 完全解耦,向上转型;

    应用:

    • 适配器设计模式;
    • 工厂设计模式;

    特点:

    • 包含着abstract 方法的类都是抽象类,抽象类用abstract 来修饰
    • 因为抽象类不能实例化,所以必须被继承;
    • 接口是极度抽象化的类;
    • 任何子类必须重写父类的抽象方法;
      详情:
    • 详情请看《Java编程思想》

    相关文章

      网友评论

          本文标题:聊聊继承、多态和抽象

          本文链接:https://www.haomeiwen.com/subject/drcujttx.html