下面几个部分都在同一个project里面
package com.rimi.duotai;
import java.lang.reflect.Method;
import com.rimi.abstractdemo.Alimal;
import com.rimi.abstractdemo.Cat;
import com.rimi.abstractdemo.Dog;
/*****************************这是含有main函数的class ***************/
public class DuoTaiDemo {
public static void main(String[] args) {
// 多态的概念: 父类类型可以接收子类对象(父类指针可以执行子类对象)
Dog dog = new Dog("小黑", "公");
Cat cat = new Cat("小花", "母");
// 赋值的时候是将(低类型转换为了高类型)子类型转换为父类型会自动提升(向上转型是自动的)
Method(dog);
}
private static void Method(Alimal d) {
d.eat();
d.shout();
// 在实际要使用猫或狗类型的函数中,就需要再将动物类型转换回对应的实际类型
// 这种就是叫做向下转型,也是需要强制转换,需要判断当前的类型是否可以转换为对应类型
// 使用关键字 instanceof 来判断类型是否匹配
if (d instanceof Dog) {
Dog dd = (Dog)d;
dd.lookHome(); // 能输出 因为d是Dog类创建的对象
}
if (d instanceof Cat) {
Cat cc = (Cat)d;
cc.catchMouse(); // 不能输出,因为d是Dog类创建的对象,不是Cat创建的
}
}
}
/*******************定义Alimal类 animal写错了,没改 ************/
package com.rimi.abstractdemo;
// 包含抽象方法的类必须定义为抽象类
// 抽象类就是在类名称前加上abstract
public abstract class Alimal {
private String name;
private String gender;
// 为了子类能方便直接继承,建议写出无参构造
public Alimal() {}
// 带参数的构造函数
public Alimal(String name, String gender) {
super();
this.name = name;
this.gender = gender;
}
// final修饰的方法叫最终方法,只能使用,不能被子类覆盖重写
public final void eat() {
System.out.println(name+"在吃东西");
}
// 功能知道有,但是具体的实现不清楚,不具体,模糊的
// 抽象:使用关键字abstract来定义
// 当修饰函数时,函数就是抽象方法
// 有抽象方法的类也必须时抽象的(抽象类)
public abstract void shout();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
/**************定义一个Dog类 继承自Alimal **********/
package com.rimi.abstractdemo;
// 使用关键字extends继承alimal
public class Dog extends Alimal {
// 静态修饰变量后,就变成共享的一个变量,所有对象都可以获取和修改
// 如果当前变量的值是固定的,当前变量在初始化后就不能被修改,只能获取
// 就可以用 final(最终的) 关键字修饰,修饰以后的变量就变成了常量
public final static double PI = 3.14;
// 构造函数不能继承,需要有参构造必须自己实现
public Dog(String name, String gender) {
super(name, gender);
}
// 重写父类的方法实现子类特有的功能
@Override
public void shout() {
System.out.println("汪汪汪···");
}
public void lookHome() {
System.out.println(getName()+"在看家");
}
}
/*************定义一个Cat类,继承自Alimal ********/
package com.rimi.abstractdemo;
// 如果继承的父类是抽象类,必须实现抽象类的抽象方法才可以定义普通可以实现对象的类
public class Cat extends Alimal {
// 猫的构造函数
public Cat(String name, String gender) {
super(name, gender);
}
// 必须重写的父类的抽象方法
@Override
public void shout() {
System.out.println("喵喵喵···");
}
public void catchMouse() {
System.out.println(getName()+"在抓老鼠");
}
}