Java继承和多态

这是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: Tom
animalName: Cat
Tom is mouse? false
Tom is cat? true
Tom 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: Tom
animalName: Cat
-----------------
Age: 3
Height: 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: Cat
Animal Name of cat2: Asian Cat
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值