Java继承和多态实例

  咱们知道面向对象的三大特性是封装、继承和多态。然而咱们有时候老是搞不清楚这些概念。下面对这些概念进行整理,编程

为之后面向抽象的编程打下坚实的基础。设计模式

  封装的概念仍是很容易理解的。若是你会定义类,那么相信你对封装的概念已经彻底掌握了。下面定义的几个类,就是对数据的封装。ide

  继承的好处是代码复用。继承的子类自动拥有父类中的全部属性和方法。因此继承已存在的类就是复用这些类的方法和域。函数

在此基础上,子类还能够添加一些新的方法和域,以知足新的需求。这是Java程序设计中的一项核心技术。this

  那么如何判断是否须要继承呢?"is-a"关系是继承的一个明显特征。这句话的意思能够解释为:Student之因此继承Person,spa

是由于Student 是Person。若是没有这个关系也就不须要这个继承了。这也是里氏替换原则的定义,子类型必须可以替换掉它们的父类型。设计

  在经过扩展超类定义子类的时候,仅需指出子类与超类的不一样之处。所以在设计类时,应该将通用的方法放到超类中,code

而将具备特殊用途的方法放到子类中,这种将通用的功能放到超类的作法,在面向对象程序设计中十分广泛。对象

  动态绑定有一个很是重要的特性:无需对现存的代码进行修改,就能够对程序进行扩展。因此多态是开放封闭原则的基础。blog

  下面是一个继承和多态实现的具体例子:

 abstract 是抽象的关键字。(最好从抽象类继承而不是从具体类继承)。

public abstract class Person {  // 抽象类
    private String name;  // 私有变量
    
    public String getName() {  // Getter方法
        return name;
    }
    public void setName(String name) {  //Setter方法
        this.name = name;
    }
        
    public Person(String name) {  // 构造函数,用于初始化name
        super();
        this.name = name;
    }
    public abstract String getDesc();  // 抽象类中的抽象方法。  只有声明,没有具体实现。
  

      public String toString(){      // toString方法覆盖了Object类的toString方法
         return name + getDesc();
      }


}

 extends 是继承的关键字。Student继承Person,因此Student拥有name属性。

public class Student extends Person {  // 继承类
    private String major; // 新增长的数据    

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }    

    public Student(String name,String major) { // 构造函数用于初始化
        super(name);   // 调用超类构造函数
        this.major = major;
    }

    @Override
    public String getDesc() {  // 必须实现超类中的抽象方法
        // TODO Auto-generated method stub
        return " : a student, major is " + major;
    }

 凡是继承超类的子类,必须实现(不管是哪一种实现方式)超类中定义的抽象方法。

public class Employee extends Person{

private double salary;

    public double getSalary() {
    return salary;
}

public void setSalary(double salary) {
    this.salary = salary;
}

    public Employee(String name, double salary) {
    super(name);
    this.salary = salary;
}

    @Override
    public String getDesc() {
        // TODO Auto-generated method stub
        return " :a employee, salary is " + salary;
    }

}

 

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Person[] p=new Person[2];    
        p[0]=new Student("Mark", "IT");
        p[1]=new Employee("Jerry", 2000);
        for (Person person : p) {
            System.out.println(person.getName()+person.getDesc());
        }
    }

}

结果:

从这个例子也能够看出,没有封装就谈不上继承,而没有继承,就不可能有所谓的多态。

而理解封装、继承和多态(特别是多态)是理解设计模式的基础。

相关文章
相关标签/搜索