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();
		}
	}
}

  

原文地址:https://www.cnblogs.com/SasaL/p/10000947.html