JAVA多态

概念:

“多态”:现实中的一类事物的多种形态:
一类事物    ----->      具体形态
  树 -----> “杨树”
  树       -----> “柳树”
  花 -----> “玫瑰”
  花 -----> “百合”
Java中表现:使用父类类型的引用,指向它的某个子类的对象;
Student stu = new Student();
//多态
Person p = new Student();
左边:父级(爷级),可以是类、抽象类、接口
右边:子级对象
左右两边必须要有“继承”/“实现”关系。
多态_多态的代码体现
class Car{}
class BenZ extends Car{}
测试代码:
//多态形式
Car c = new BenZ();
说明:创建的是子类对象,只是将子类类型的引用隐式的转换为父类类型,转换后,c变量反而被限
制在“父类”范围内,访问的成员只能是父类中的。
多态中成员的访问
多态时,访问的成员只能是“父类的”(在父类中必须要有)
多态时,不能访问“子类的特有成员”;
多态中访问被子类覆盖的成员属性的特点
class Fu{
int num = 10;
}
class Zi extends Fu{
int num = 20;
}
测试代码:
//多态
Fu f = new Zi();
System.out.println(f.num);//10
注意:
class Fu{
}

class Zi extends Fu{
int num = 20;
}
测试代码:
//多态
Fu f = new Zi();
System.out.println(f.num);//编译时异常。num在父类中没有定义。
编译看左边(编译时,访问的成员在父类中必须要有),运行时看左边(运行时,访问的也是父类的)

多态中访问被子类重写的成员方法的特点
class Fu{
public void show(){
System.out.println("a");
}
}
class Zi extends Fu{
public void show(){
System.out.println("b");
}
}
测试代码:
Fu f = new Zi();
f.show();//b

编译看左边,运行看右边(执行的是子类重写的)

多态中成员的访问_总结

1).多态时访问的总体规则:
多态时访问的成员,在父类中必须存在(定义、声明),访问的都是父
类的。只有当子类重写父类方法时,访问的是子类的(原因:方法的动态绑定

先在子类中找)。

多态_多态的好处和局限

1).多态的形式:
父类  =  new  子类对象();
父抽象类  = new  子类对象();
父接口    = new  子类对象();
2).接口多态:
interface IA{
public void show();
}
class Zi implements IA{
public void show(){
System.out.println("a");
}
}
测试代码:
IA a = new Zi();
a.show();//执行的是子类重写的show().
3).多态的好处:
公司有一辆轿车,招一名司机,开车。
车:
属性:
行为:run(),stop()
轿车类 extends 车
属性:
行为:
大客车 extends 车
属性:
行为:
三蹦子  extends 车
属性:
行为:
司机类:
属性:
行为:开车(轿车 jc)
                         开车(大客车 dkc)
...每当来一辆新车,司机类都要添加一个新方法,不利于更新。
更改为以下形式,后期再增加车,只需要那个车继承自“车类”即可,这个
方法不用修改。
开车(车 c){//多态:车 c = new 轿车类(); 车 c = new 大客车(); 车 c = 三蹦子();
c.run();
c.stop();
}
测试类:
轿车类 jc = new 轿车类();
司机类 sj = new 司机类();
sj.开车(jc);
大客车  dkc = new 大客车();
sj.开车(dkc);//sj.开车(new 大客车());
三蹦子 sbz = new 三蹦子();

sj.开车(sbz);

4).多态的弊端:多态时不能访问子类特有成员。

多态的向上转型和向下转型
1).向上转型:
回顾之前基本类型:
int a = 10;
long b = a;//隐式转换--向上提升
多态:
Person  p = new Student();//隐式的向上转型
多态时,向上转型后:不能访问子类特有成员,
               如果想访问子类特有成员,可以向下转型。
2).向下转型:
Person p = new Student();
Student stu = (Student)p;
注意:向下强转时,必须转换为之前指向的类型,不能转换为其它子类类型:
Person p = new Student();
Person p2 = new Teacher();
Student stu = (Student)p;//OK的
Student stu2 = (Student)p2;//编译成功,运行时异常:ClassCastException
3).向下转型存在风险,建议:先判断,再转换
Person p = new Student();
if(p instanceof Student){//强烈建议:在向下转型前先做判断,然后在转换,使程序健壮。
Student stu = (Student)p;
}
阅读更多

没有更多推荐了,返回首页