聊聊继承、多态和抽象

想了很久,的第一篇文章写些什么好,自己是个技术小白,讲不了什么高深的技术,那就来聊聊我所认知的一些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编程思想》

你可能感兴趣的:(聊聊继承、多态和抽象)