Java多态
星鸦wyk 人气:0在结束继承内容之后便是多态,这同样也是面向对象程序的特性
有一点需要说明:为方便演示,所以我在一个java文件中定义了多个类,但实际上是不推荐这么做的
1.多态的概念
简单来讲就是不同的对象去完成同一个行为,但是产生了不同的状态
一个很简单的例子:学校某个班级的学生参加同一场考试,考试结束后不同的学生的考试成绩都是不同的,有的不及格、有的在及格线上游走、而有的则是高分,那么你在哪个水平~( ̄▽ ̄)~
要实现多态是需要条件的,具体条件如下:
1.必须在继承体系下,且发生了向上转型
2.子类要对父类的方法进行重写
3.通过父类的引用调用重写方法
上述涉及的一些新的概念,下面会详细介绍
2.向上转型
2.1概念
我们对前文所写的类进行一下修改:
class Plant { String name; String source; String genu; public void func() { System.out.println("父类方法"); } } class Tree extends Plant { public void trait() { System.out.println("子类方法"); } }
所谓向上转型就是创建一个子类对象,将其当成父类来进行使用
具体操作如下:
Plant tree=new Tree();
因为是当成父类来使用,所以此时tree便不能调用子类的方法
Java中有向下转型,但因为向下转型不安全,所以就略过
2.2常见的向上转型的形式
上述例子中是第一种:直接赋值
除此以外还有两种形式
作为方法的参数
作为方法的返回值
3.重写
即子类对父类的方法进行重新编写,此方法不能是构造方法,也不能被private、final以及static修饰,而我们重写的是方法里面的内容,方法的方法名、返回值和参数都不能修改
依旧是对类进行修改:
class Plant { String name; String source; String genu; public void trait() { System.out.println("父类方法"); } } class Tree extends Plant { @Override //注解,此注解可以进行一些合法性校验 public void trait() { System.out.println("子类方法"); } }
我们向上转型后看看调用trait的结果是什么:
调用的是子类的方法,而这也是重写的特点
其实在编译的时候,调用的确实是父类的方法,但重写的方法是在执行阶段才确定调用哪个方法(即动态绑定)这也是重写和重载之间本质的区别
3.1重写的注意事项
1.static、final、private修饰的方法以及构造方法不能重写
2.子类方法的访问权限要大于等于父类
3.在JDK7之后,重写的方法返回值类型可以不同,但必须具有父子关系,这属于协变类型
4.不要在构造方法中调用重写的方法
最后一点单独说明:假设父类的构造方法调用了重写的方法,因为子类的构造方法会首先调用父类构造方法,所以在子类对象还没有完全构造完成的时候就已经动态绑定调用了重写的方法,这种情况下程序出现问题的几率会大大增加
在了解完向上转型和重写之后业基本知道Java中是如何实现多态的:在继承体系下结合向上转型和重写实现多态
多态的内容结束,完
加载全部内容