写一个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("类型不符");
}
}
}

原文:http://www.cnblogs.com/liuyanzeng/p/5893818.html