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