java 多态

写一个father类,里面有两个属性和一个work方法,输出一句话。一个father的子类son重写work方法,并且还自己有一个sing方法用向上转型和向下转型测试

package liu0921;

public class Father {
	
	//属性
	private String name;
	private int age;
	//方法
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
	public Father(String name) {
		super();
		this.name = name;
	}
	public Father() {
		super();
	}
	
	//方法
	//default 不能被别的包的类访问
	//protected 保护的其他包的子类内部可以访问
	public void Work()
	{
		System.out.println("我劳动,我光荣");
	}
	

}

  

package liu0921;

public class Son extends Father{
	//重写
	public void Work()
	{
		System.out.println("我要上天!");
	}
	
	public void sing()
	{
		System.out.println("喜欢唱歌");
	}

}

  

package liu0921;

public class Ceshi_father {

	public static void main(String[] args) {
		Son s1=new Son();
		s1.Work();
		s1.sing();
		s1.setName("张三");
		System.out.println(s1.getName());
		//向上转型
		//多态的表现  
		//隐式转换
		Father f1=new Son();//子类转成父类
		//如果方法被子类重写了那就调用子类的重写的方法
		f1.Work();
		
		//向下转型
		//一般在向下转型之前必须先进行向上转型
		//Son s2=new Father();//类型不匹配:不能从 Father 转换为 Son
		Son s2=(Son)f1;//f1实则是父类的实例
		s2.sing();
		
		//能装下所有类型的数据类型
		//instanceof 测试它左边的对象是否是它右边的类的实例
		Object obj=new Father();
		Object[] ary=new Object [5];
		
		
		ary[0]=123;
		ary[1]="abc";
		ary[2]=f1;
		ary[3]=new Father();
		ary[4]=s1;
		
		if(ary[3] instanceof Son)//ary[3]不是son的子类所以返回类型不符,ary[4]中的s1是,所以可以输出son中的方法
		{
		Son obj2=(Son)ary[4];
		obj2.sing();
		obj2.Work();
		}
		else
		{
			System.out.println("类型不符");
		}
		
		
		
		
		
	}

}

  

原文地址:https://www.cnblogs.com/liuyanzeng/p/5893818.html