黑马程序员技术交流社区
标题:
【Java基础交流】之【一张贴搞定多态调用】!!
[打印本页]
作者:
传奇查
时间:
2015-11-18 17:41
标题:
【Java基础交流】之【一张贴搞定多态调用】!!
感觉对你有用就给个鼓励吧~
~
多态的概念:
package cn.fuxi.jiekou;
/**
* 多态:某一类事物的多种存在形态
*
* 例:动物中猫,狗.
* 猫这个对象对应的类型时猫类型:猫 c = new 猫();
* 同时猫也是动物中的一种,可以把猫称为动物:动物 c = new 猫();
* 动物是猫和狗具体事物中抽取出来的父类型.
* 父类型引用指向了子类对象.
*
* 多态性简单说就是一个对象对应着不同类型.
*
* 体现:父类或者接口的引用指向或者接收自己的子类对象.
* 作用:多态的存在提高了程序的扩展性和后期的可维护性.
* 前提:
* 1.需要存在继承或者实现关系.
* 2.需要有覆盖操作.
*
* 好处:提高了代码的扩展性,前期定义的代码可以使用后期的内容.
* 弊端:前期定义的内容不能使用(调用)后期子类的特有内容.
*/
abstract class Animal{
abstract void eat();
}
class Dog extends Animal{
void eat(){
System.out.println("狗吃骨头");
}
void lookHome(){
System.out.println("狗看家");
}
}
class Cat extends Animal{
void eat(){
System.out.println("猫吃猫粮");
}
void catchMouse(){
System.out.println("猫捉老鼠");
}
}
class Pig extends Animal{
void eat(){
System.out.println("猪吃饲料");
}
void gongDi(){
System.out.println("猪会拱地");
}
}
public class InterfaceDemo5 {
public static void main(String[] args) {
Animal c = new Cat();
Dog d = new Dog();
method(c);//猫吃猫粮
method(d);//狗吃骨头
method(new Pig());//猪吃饲料
//自动类型提升,猫对象提升到了动物类型.但是特有功能无法访问,作用就是限制对特有功能的访问.
//向上转型,将子类型隐藏,就不能使用子类特有方法了
//c.catchMouse();报错
//如果还想用具体动物猫的特有功能,可以向下转型(强转为猫)
Cat c1 = (Cat)c;
c.eat();
c1.catchMouse();
//注意:对应转型,自始至终都是子类对象在做类型的变化.
Animal dog = new Dog();
Cat e = (Cat)dog;//编译不报错,但是运行报错,Dog无法转换成Cat
e.eat();//无法运行,编译不报错
}
public static void method(Animal a){
a.eat();
}
}
复制代码
运行结果:
猫吃猫粮
Exception in thread "main" 狗吃骨头
猪吃饲料
猫吃猫粮
猫捉老鼠
java.lang.ClassCastException: cn.fuxi.jiekou.Dog cannot be cast to cn.fuxi.jiekou.Cat
at cn.fuxi.jiekou.InterfaceDemo5.main(InterfaceDemo5.java:70)
多态应用案列:
package cn.fuxi.jiekou;
//毕老师和毕姥爷的故事
class BiLaoYe{
void teacher(){
System.out.println("管理");
}
void fishing(){
System.out.println("钓鱼");
}
}
class BiLaoShi extends BiLaoYe{
void teacher(){
System.out.println("java");
}
void movie(){
System.out.println("看电影");
}
}
public class DuoTai {
public static void main(String[] args) {
BiLaoShi bs = new BiLaoShi();
bs.teacher();
bs.movie();
//多态调用时,只能用重写过的父类的功能,不能用自己特有的功能
BiLaoYe by = new BiLaoShi();
by.teacher();
by.fishing();
//如果要用自己特有的功能,可以把类型转换为自己.
BiLaoShi by1 =(BiLaoShi)by;
by1.movie();
}
}
复制代码
运行结果:
java
看电影
java
钓鱼
看电影
转换前的类型判断:
package cn.fuxi.duotai;
/**
* P.S. instanceof:用于判断对象的具体类型,只能用于引用数据类型判断,通常在向下转型前用于健壮性的判断.
*/
class Animal{
void eat(){}
void sleep(){}
}
class Cat extends Animal{
void eat(){
System.out.println("猫吃猫粮");
}
void catchMouse(){
System.out.println("猫捉老鼠");
}
}
class Dog extends Animal{
void eat(){
System.out.println("狗吃骨头");
}
void lookHome(){
System.out.println("狗会看家");
}
}
public class InstanceofDemo {
public static void main(String[] args) {
Animal a = new Cat();
method(a);
method(new Cat());
method(new Dog());
}
public static void method(Animal a){
a.eat();
if(a instanceof Cat){
Cat c =(Cat)a;
c.catchMouse();
}
else if(a instanceof Dog){
Dog d = (Dog)a;
d.lookHome();
}
}
}
复制代码
运行结果:
猫吃猫粮
猫捉老鼠
猫吃猫粮
猫捉老鼠
狗吃骨头
狗会看家
多态特点汇总:
package cn.fuxi.duotai;
/**
* 多态时,成员的特点:
* 1.成员变量
* 编译时:参考引用型变量所属的类中是否有调用的成员变量?有,编译通过,没有,编译失败.
* 运行是:参考引用型变量所属的类中是否有调用的成员变量?并运行该所属类中的成员变量.
* 简单说:编译和运行都参考等号的左边.(成员变量全用爹的)
*
* 2.成员函数(非静态)
* 编译时:参考引用型变量所属的类中是否有调用的函数.有,编译通过.没有,编译失败.
* 运行时:参考的是对象所属的类中是否有调用的函数.
* 简单说:编译看左边,运行看右边.(自己有用自己,没有就借爹的)
*
* 3.静态函数
* 编译时:参考的是对象所属的类中是否有调用的函数.
* 运行时:参考的是对象所属的类中是否有调用的函数.
* 简单说:编译和运行都砍左边.(静态全用爹的)
*/
class Fu{
int num = 3;
void show(){
System.out.println("fu show");
}
static void method(){
System.out.println("fu static method");
}
}
class Zi extends Fu{
int num = 4;
void show(){
System.out.println("zi show");
}
static void method(){
System.out.println("zi static method");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//Zi z = new Zi();
//System.out.println(z.num);
Fu f = new Zi();
System.out.println(f.num);
f.show();
f.method();
Fu.method();
//Zi.method();
}
}
复制代码
运行结果:
3
zi show
fu static method
fu static method
感觉对你有用就给个鼓励吧~
~
作者:
洋葱头头
时间:
2015-11-18 17:54
没用 我都会了
作者:
传奇查
时间:
2015-11-18 21:21
洋葱头头 发表于 2015-11-18 17:54
没用 我都会了
您是大神呀!已经博士后毕业了~我们还是努力奋斗的小学渣~
作者:
袁有福123
时间:
2015-11-18 22:51
很棒 !将这些全部都写在一起 起到了对比的效果 更能清楚明白的看出其中的区别所在 非常好!赞!
作者:
oup
时间:
2015-11-18 23:18
楼主总结得非常不错!
作者:
mlxg
时间:
2015-11-18 23:29
有心,赞一个!!!
作者:
DoubleUUU
时间:
2015-11-19 00:13
多态已然弄懂,现在突破多线程
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2