先创建一个Person抽象类和两个接口IPaint、ISing用于继承和实现,如下
package cn.sasa.demo2; //抽象类 public abstract class Person { private String name; private int age = 1; public int num = 1; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } public void sayHi() { System.out.println("hi~"); } //抽象方法 public abstract void work() ; }
package cn.sasa.demo2; public interface IPaint { public abstract void paint(); }
package cn.sasa.demo2; public interface ISing { public abstract void sing(); }
然后准备两个普通类Teacher、Student继承和实现以上类和接口
package cn.sasa.demo2; //继承了Person,实现了IPaint,ISing接口 public class Teacher extends Person implements IPaint, ISing{ @Override public void sing() { System.out.println("teacher is singing"); } @Override public void paint() { System.out.println("teacher is painting"); } @Override public void work() { System.out.println("teach"); } //本类特有的方法 public void exam() { System.out.println("exam"); } }
package cn.sasa.demo2; //继承了Person,实现了IPaint接口 public class Student extends Person implements IPaint{ private int age = 2; public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } public int num =2; @Override public void paint() { System.out.println("stu is painting"); } @Override public void work() { System.out.println("study"); } //本类特有的方法 public void doHomework() { System.out.println("do homework"); } }
创建一个Test类测试:
package cn.sasa.demo2; public class Test { public static void main(String[] args) { // 多态:一个类型的多种形态 // 实现多态两个关键点: // 1、有继承或实现关系 // 2、子类重写父类的方法 或 子类实现接口 // 多态演示一:类的多态 Person stu = new Student(); Person tea = new Teacher();// 向上转型 // 成员变量,编译运行都看父类 System.out.println(stu.num); // 成员方法,编译看父类,运行看子类,父类有此方法则编译成功,但运行时调用的是子类的方法 // 调用的都是work(),但执行的是子类各自的work()方法 System.out.println(stu.getAge()); stu.work(); tea.work(); // 多态演示二:接口的多态 IPaint teaPaint = new Teacher(); IPaint stuPaint = new Student(); teaPaint.paint(); stuPaint.paint(); // 以上将Student和Teacher向上转型成了Person或者接口IPaint // 那么如果我们要调用子类特有的方法该怎么办? // 方法:向下强转 // 子类类型 变量名 = (子类类型)父类变量 Teacher t = (Teacher) tea; t.exam(); // 这里有个强转出现转错成其他类型的可能性,那么在强制转换前,先判断,这个类是不是某个子类 // 关键字:instanceof if (tea instanceof Teacher) { ((Teacher) tea).exam(); } if (stu instanceof Student) { ((Student) stu).doHomework(); } // instanceof 同样可以判断接口 if (stuPaint instanceof ISing) { ((ISing) stuPaint).sing(); } else { System.out.println("wrong type"); } if (teaPaint instanceof IPaint) { teaPaint.paint(); } } }