Thứ Năm, 21 tháng 12, 2017

Kế thừa và đa hình trong java

public class SinhVien {

    public static void main(String[] args) {
        Cat c=new Cat("Tom",2,1);
        Mouse m=new Mouse("Jerry",3);
       
        System.out.println(""+getT(c)); //Cat
        System.out.println(""+getT(m)); //Mouse
       
    }
   
    //Ứng dụng đa hình, truyền qua tham số
    public static String getT(Animal animal) {
       
        return animal.getAnimalName();
    }
}

abstract class Animal {

    // Tên, ví dụ Mèo Tom, Chuột Jerry.
    private String name;

    // Constructor mặc định.
    public Animal() {
        // Gán giá trị mặc định cho 'name'.
        this.name = this.getAnimalName();
    }

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // Đây là một phương thức trừu tượng.
    // Trả về tên của loài động vật này.
    // Nội dung cụ thể của phương thức này
    // sẽ được thực hiện (implemented) tại các lớp con.
    public abstract String getAnimalName();

}

class Cat extends Animal {

    private int age;
    private int height;

    public Cat(int age, int height) {
        // Gọi tới Constructor mặc định của lớp cha (Animal).
        // Nhằm mục đích gán tạo giá trị cho các trường (field) của lớp cha.
        super();
        // Sau đó mới gán giá trị cho các trường (field) của nó.
        this.age = age;
        this.height = height;
    }

    public Cat(String name, int age, int height) {
        // Gọi tới Constructor của lớp cha (Animal)
        // Nhằm mục đích gán tạo giá trị cho các trường (field) của lớp cha.
        super(name);
        // Sau đó mới gán giá trị cho các trường (field) của nó.
        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;
    }

    // Thực hiện (implement) phương thức trừu tượng được khai báo tại lớp cha.
    @Override
    public String getAnimalName() {
        return "Cat";
    }
}

class Mouse extends Animal {

    private int weight;

    // Constructor mặc định.
    public Mouse() {
        // Gọi tới cấu tử Mouse(int)
        // Call to constructor Mouse(int)
        this(100);
    }

    // Constructor có 1 tham số
    public Mouse(int weight) {
        // Nếu bạn không gọi bất kỳ một super(..) nào.
        // Java sẽ gọi một super() mặc định.
        // super();
        this.weight = weight;
    }

    // Constructor có 2 tham số.
    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";
    }
}

class AsianCat extends Cat {

    public AsianCat(String name, int age, int height) {
        super(name, age, height);
    }

    // Ghi đè (override) phương thức của lớp cha (Cat)
    @Override
    public String getAnimalName() {
        return "Asian Cat";
    }
}