java 多态
先创建一个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();
}
}
}

浙公网安备 33010602011771号