刚接触Java,关于多态下向上转型和向下转型,以及父类和子类的调用很混乱,看了一天资料,终于搞明白了
- 关于多态向上转型和向下转型的要点
- 一、向上转型后子类不能调用自己的私有属性和私有方法,只能调用父类属性和重写父类方法
- 二、如果向上转型后想要调用子类的私有属性和方法,可以强制向下转型
-
Animal t1=(Animal)t
-
新创建了一个Animal类型的对象t1指向强制转换类型后的t 注:**t1和t的地址一样**
- 三、向下转型是有风险的,必须是继承关系才能转型成功,否则程序运行时就会抛出异常,为了防止这种情况,就要使用instanceof运算符
直接上代码
父类
package com.test.animal;
/*
* Animal父类
*/
public class Animal {
String name="动物";
public Animal(){
}
public void show() {
System.out.println("我是父类Animal");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sleep(Animal ani) {
System.out.println(ani.getName()+"睡觉");
}
}
子类
Cat
package com.test.animal;
/*
* Cat子类
*/
public class Cat extends Animal {
String name="小猫";
public Cat() {
}
public void show() {
System.out.println("我是子类cat");
}
public void show1() {
System.out.println("我是子类cat的私有方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Dog
package com.test.animal;
/*
* Dog子类
*/
public class Dog extends Animal {
String name="小狗";
public Dog() {
}
public void show() {
System.out.println("我是子类Dog");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类
Test
package com.test.animal;
public class Test {
public static void main(String[] args) {
Animal t=new Cat();
System.out.println(t.name); //调用父类的属性name
t.show(); //调用子类重写的方法
/*
* 向上转型后可以很方便的调用父类的sleep方法
* 新加一个动物就可以用t.sleep(new 新动物类名() )来快速调用
* 比如说以后有个Bird类,就可以直接t.sleep(new Bird())
* 如果不使用向上转型就要在Bird类中重写一个sleep方法,重新申请对象,重新调用,太麻烦
*/
System.out.println(t.getName()); //同调用子类重写方法来获取子类属性
t.sleep(new Animal()); //直接new匿名对象代入到方法
t.sleep(new Cat());
t.sleep(new Dog());
System.out.println("============================");
//instanceof判断t是否是Animal的子类
if(t instanceof Animal) { //当t属于Animal类下时才能强制转换
Cat t1=(Cat)t; //强制向下转换
System.out.println(t1.name); //转换后可以直接访问到子类属性
t1.show1(); //直接访问子类的私有方法
}
}
}
运行结果
动物
我是子类cat
小猫
动物睡觉
小猫睡觉
小狗睡觉
===============================
小猫
我是子类cat的私有方法
总结:
向上转型
优点:可以快速的调用和重写父类方法,使代码简洁,大大减少程序员的工作量,这就是面向对象的思想
缺点:比起Cat t=new Cat()不能直接调用子类的私有属性和方法,但这种情况可以用强制向下转型来解决