Java - 多态



Ps:之前还想不通为什么是在运行时才决定的?不是编译的时候就可以看出来了吗!原来有一种情况,就是兄弟类之间的的强转,编译时是可以通过的,但是运行会报错!(如图)

/* 向上转型、隐式转型、自动转型
 * 父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法和属性
 * 注意:父类中的静态方法无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法;当然子类中
 * 可以写与父类一样的静态方法,只是该方法不是被重写下来,而是子类独有的静态方法。
 * 小类转型为大类
 */
Animal one=new Animal(); // 1
Animal two=new Cat();    // 2
Animal three=new Dog();  // 3

one.eat(); // 动物都有吃东西的能力
two.eat(); // 猫吃鱼~~
two.setMonth(2);
two.getMonth();
// two.run(); //CE
three.eat(); // 狗吃肉~~

instanceof

 

/* 向下转型、强制类型转换
 * 子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法,也可以调用父类公开的方法
 * 必须满足转型条件才能进行强转(比如:父类->子类可以强转,但是子类与子类之间不可以强转,若违规:不会报CE而是报RE)
 * instanceof运算符:判断左边是否属于右边的实例化对象或者子类,返回true/false
 */
if(two instanceof Cat){ // true
	Cat temp=(Cat)two;
	temp.eat();
	temp.run();
	temp.getMonth();
	System.out.println("two可以转换为Cat类型");
}

if(two instanceof Dog){ // false
	Dog temp2=(Dog)two;
	temp2.eat();
	temp2.sleep();
	temp2.getSex();
	System.out.println("two可以转换为Dog类型");
}

if(two instanceof Animal){ // true
	System.out.println("Animal");
}

if(two instanceof Object){ // true
	System.out.println("Object");
}
发布了832 篇原创文章 · 获赞 1673 · 访问量 78万+

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/105014774
今日推荐