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