Java继承和多态

来源:互联网 发布:java垃圾回收机制算法 编辑:程序博客网 时间:2024/05/16 08:27
这是Java中的一个非常重要的概念。如果你想学习Java,必须更好地理解它。

1- 介绍

2- 类,构造函数和实例
3- Java继承
4- Java多态

1- 介绍

继承和多态 - 这是Java中的一个非常重要的概念。如果你想学习Java,必须更好地理解它。

2- 类,构造函数和实例

需要在开始学习Java之前明确有关类,继承,构造函数和实例理解。 我们考虑一下 Person类,描述了全名,出生年份,生日,逝世日期等信息。
  • Person.java
package com.yiibai.tutorial.inheritance.basic;public class Person {    // Field name - name of person    private String name;    // Field bornYear    private Integer bornYear;    // Field diedYear.    private Integer diedYear;    // Constructor with 3 parameters. The aim is to assign value for the field of Person.    // Specify the name, year of birth, died year.    public Person(String name, Integer bornYear, Integer diedYear) {        this.name = name;        this.bornYear = bornYear;        this.diedYear = diedYear;    }    // Constructor with 2 parameters.    // The aim is to assign value for the field of Person.    // Not assign for diedYear    public Person(String name, Integer bornYear) {        this.name = name;        this.bornYear = bornYear;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getBornYear() {        return bornYear;    }    public void setBornYear(Integer bornYear) {        this.bornYear = bornYear;    }    public Integer getDiedYear() {        return diedYear;    }    public void setDiedYear(Integer diedYear) {        this.diedYear = diedYear;    }}

  • PersonDemo.java
package com.yiibai.tutorial.inheritance.basic; public class PersonDemo {     public static void main(String[] args) {         // Instance: Thomas Edison.        Person edison = new Person("Thomas Edison", 1847, 1931);         System.out.println("Info:");        System.out.println("Name: " + edison.getName());        System.out.println("Born Year: " + edison.getBornYear());        System.out.println("Died Year: " + edison.getDiedYear());         // Instance: Bill Gates        Person billGates = new Person("Bill Gate", 1955);         System.out.println("Info:");        System.out.println("Name: " + billGates.getName());        System.out.println("Born Year: " + billGates.getBornYear());        System.out.println("Died Year: " + billGates.getDiedYear());     } }

区分类,构造函数和实例

Person模拟某一种人的类,这是抽象的东西,但它的信息,在上面的例子中,信息是姓名,出生年份,死亡年份。

构造函数
  • 构造函数总是与类的名称相同
  • 一个类拥有一个或多个构造函数。
  • 构造函数可带或不带参数,没有参数构造函数是默认调用构造函数。
  • 构造函数是用来创建类的实例。

看下面的例子,创建一个构造函数对象(实例)

3- Java继承

我们需要几个类的作为练习例子。
  • Animal: 模拟动物类
  • Duck:  动物(Animal)的子类
  • Cat: 动物(Animal)的子类
  • Mouse:  动物(Animal)的子类

在这里,我们有 Animal 类,它没有方法体。
  • public abstract String getAnimalName();
这种方法是一个抽象方法,在子类中,你需要声明和实现这个方法。
Animal 类如果有一个以上抽象方法,它必须声明为抽象的类。抽象类有构造函数,但不能用它创建的实例。
  • 在本质上意味着如果要创建动物的一个对象,需要从一个特定的动物物种创建,在我们的这个实例中,就必须从猫(Cat),鼠标(Mouse)或鸭(Duck)的构造函数来创建。
  • Animal.java
    package com.yiibai.tutorial.inheritance.animal; // Class with at least one abstract method must be declared as abstract.public abstract class Animal {     // Name, for example, Tom Cat, Jerry Mouse.    private String name;     // Default constructor    public Animal() {        // Assign the default        this.name = this.getAnimalName();    }     public Animal(String name) {        this.name = name;    }     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     // Returns the name of this animal.    // An abstract method.    // The specific contents of this method will be written in the subclass.    public abstract String getAnimalName(); }

接下来看看从Animal继承的Cat类

Cat还具有构造函数,也有自己的字段。在构造函数中的第一行必须调用super(..),这意味着调用父类的构造函数,给父类的字段赋值。
如果你不调用super() ,JAVA在编译时构造函数的第一行会自动插入super() 。
  • Cat.java
    package com.yiibai.tutorial.inheritance.animal; public class Cat extends Animal {     private int age;    private int height;     public Cat(int age, int height) {        // Call the default Constructor of the parent class (Animal)        // Aims initialize the fields in the parent class.        super();         // Next, Assign value to its fields        this.age = age;        this.height = height;    }     public Cat(String name, int age, int height) {             // Call the default Constructor of the parent class (Animal)        // Aims initialize the fields in the parent class.                super(name);         // Next, Assign value to its fields        this.age = age;        this.height = height;    }     public int getAge() {        return age;    }     public void setAge(int age) {        this.age = age;    }     public int getHeight() {        return height;    }     public void setHeight(int height) {        this.height = height;    }      // Implement content for abstract methods declared in the parent class.    @Override    public String getAnimalName() {        return "Cat";    } }

当创建一个Cat对象,会发生什么?

来看看动物的子类Mouse类

  • Mouse.java
    package com.yiibai.tutorial.inheritance.animal; public class Mouse extends Animal {     private int weight;     // Default constructor    public Mouse() {        // Call to constructor Mouse(int)        this(100);    }      // Constructor with one parameter.    public Mouse(int weight) {                 // If you does not call super(..)        // then java will call to default Constructor of the parent class.        // super()                 this.weight = weight;    }      // Constructor with 2 parameters.    public Mouse(String name, int weight) {        super(name);        this.weight = weight;    }     public int getWeight() {        return weight;    }     public void setWeight(int weight) {        this.weight = weight;    }     @Override    public String getAnimalName() {        return "Mouse";    }}
  • InstanceofDemo.java
    package com.yiibai.tutorial.inheritance.demo; import com.yiibai.tutorial.inheritance.animal.Animal;import com.yiibai.tutorial.inheritance.animal.Cat;import com.yiibai.tutorial.inheritance.animal.Mouse; public class InstanceofDemo {     public static void main(String[] args) {                  // Create an Animal object.        // Animal is abstract class        // It can not create the object from its constructors.        Animal tom = new Cat("Tom", 3, 20);         System.out.println("name: " + tom.getName());        System.out.println("animalName: " + tom.getAnimalName());          // Using instanceof operator to        // check if an object is an instance of a specific class.        boolean isMouse = tom instanceof Mouse;        System.out.println("Tom is mouse? " + isMouse);         boolean isCat = tom instanceof Cat;        System.out.println("Tom is cat? " + isCat);         boolean isAnimal = tom instanceof Animal;        System.out.println("Tom is animal? " + isAnimal);     } }
运行示例的结果:
name: TomanimalName: CatTom is mouse? falseTom is cat? trueTom is animal? true
  • InheritMethodDemo.java
package com.yiibai.tutorial.inheritance.demo; import com.yiibai.tutorial.inheritance.animal.Cat; public class InheritMethodDemo {     public static void main(String[] args) {         // Create instance of Cat.        Cat tom = newCat("Tom", 3, 20);                          // Call the method inherited from the parent class.        System.out.println("name: "+ tom.getName());        System.out.println("animalName: "+ tom.getAnimalName());                 System.out.println("-----------------");         // Call the method declared in the class Cat.        System.out.println("Age: "+ tom.getAge());        System.out.println("Height: "+ tom.getHeight());    } }
运行示例的结果:
name: TomanimalName: Cat-----------------Age: 3Height: 20

Java类转换

  • CastDemo.java
package com.yiibai.tutorial.inheritance.demo;import java.util.Random;import com.yiibai.tutorial.inheritance.animal.Animal;import com.yiibai.tutorial.inheritance.animal.Cat;import com.yiibai.tutorial.inheritance.animal.Mouse; public class CastDemo {     // Method returns a random animal.    public static Animal getRandomAnimal() {        // Returns a random value 0 or 1        int random = new Random().nextInt(2);         Animal animal = null;        if (random == 0) {            animal = new Cat("Tom", 3, 20);        } else {            animal = new Mouse("Jerry", 5);        }        return animal;    }     public static void main(String[] args) {         Animal animal = getRandomAnimal();         if (animal instanceof Cat) {            // Cast to Cat            Cat cat = (Cat) animal;             // And call method of the Cat class.            System.out.println("Cat height: " + cat.getHeight());        } else if (animal instanceof Mouse) {            // Cast to Mouse            Mouse mouse = (Mouse) animal;             // And call method of the Mouse class.            System.out.println("Mouse weight: " + mouse.getWeight());        }     } }

4- Java多态

假设你有一只猫Asian Cat,,你可以作为一只猫或者作为一种动物调用是多态的体现。
或者另外一个例子:你简历的记录是一个亚洲男子,而你实际上是一个中国人。
下面的例子说明了如何声明和现实行为。
AsianCat 是 Cat 类的子类。
  • AsianCat.java
package com.yiibai.tutorial.inheritance.animal;public class AsianCat extends Cat {    public AsianCat(String name, int age, int height) {        super(name, age, height);    }    // Override methods of the parent class (Cat)    @Override    public String getAnimalName() {        return "Asian Cat";    }}
Java的多态性如下图所述:
  • PolymorphismDemo.java
package com.yiibai.tutorial.polymorphism;import com.yiibai.tutorial.inheritance.animal.AsianCat;import com.yiibai.tutorial.inheritance.animal.Cat; public class PolymorphismDemo {    public static void main(String[] args) {        Cat cat1 = new Cat("Tom", 3, 20);        Cat cat2 = new AsianCat("ATom", 2, 19);        System.out.println("Animal Name of cat1: " + cat1.getAnimalName());        System.out.println("Animal Name of cat2: " + cat2.getAnimalName());    } }
运行示例的结果如下:
Animal Name of cat1: CatAnimal Name of cat2: Asian Cat
0 0
原创粉丝点击