- 一.多态的概念
- 二.对象的上中下转型
- 1.意义
- 2.实现
- 三.多态的应用
多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生
不同的执行结果
多态存在的三个必要条件
·需要存在继承和实现关系
·同样的方法调用而执行不同操作、运行不同代码(重写)
·在运行时父类或者接口的引用变量可以引用其子类的对象
多态的作用
·多态通过分离做什么和怎么做,从一个角度将接口和实现进行
分离
·多态消除了类型之间的耦合关系
·多态的存在提高了程序的拓展性和后期的可维护性
abstract class Animal
{
abstract void eat();
}
class Dog extends Animal
{
void eat() {
// TODO Auto-generated method stub
System.out.println("狗啃骨头");
}
}
class Cat extends Animal
{
void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼");
}
}
public class Test {
public static void main(String[] args) {
Animal an1=new Dog();
Animal an2=new Cat();
an1.eat();
an2.eat();
}
}
二.对象的上中下转型
1.意义
·由子类转型成父类,在继承图上是向上移动的,一般称为向上转型
·向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,
子类是父类的超集
·向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
·与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)
·LSP(liskov替换原则):子类型必须能够替换掉他们的基类型
·安全的上转型和LSP的实施,充分体现继承的ls-a关系
·instanceof运算符用来在运行时通过返回值来指出对象是否是特定类或者是它的子类
的一个实例
用法:
·典型的使用场合
在对对象做下转型之前,没有其他有关对象信息时务必使用instanceof来判断一下,
以避免抛出ClassCastException异常
abstract class Animal
{
abstract void eat();
}
class Dog extends Animal
{
void eat() {
// TODO Auto-generated method stub
System.out.println("狗啃骨头");
}
void sleep(){
System.out.println("狗狗睡觉");
}
}
class Cat extends Animal
{
void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼");
}
}
public class Test {
public static void main(String[] args) {
Animal an1=new Dog(); //向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
Animal an2=new Cat();
an1.eat();
an2.eat();
//an1.sleep(); //编译是不过的
// Cat cat2= (Cat)an1; // 与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)
//cat2.eat();
if(an2 instanceof Cat){
System.out.println("aa");
Cat cat2= (Cat)an2;
cat2.eat();
}
}
}
三.多态的应用
简单来说,多态是具有表现多种形式能力的特征
同一个实现接口,使用不同的实例而执行不同操作
案例:
class School
{
public Dayin dayinji;
public void AnZhaung(Dayin dayinji){ //对象的上转型
this.dayinji=dayinji;
}
public void Print(String con){
dayinji.Printcon(con);
}
}
abstract class Dayin
{
String pinpai;
public abstract void Printcon(String con);
}
class Caise extends Dayin
{
public void Printcon(String con){
System.out.println("彩色打印机:"+con);
}
public void eat(){
System.out.println("测试");
}
}
class Heise extends Dayin
{
public void Printcon(String con){
System.out.println("黑色打印机:"+con);
}
}
public class Test {
public static void main(String[] args) {
School s=new School();
Caise c=new Caise();
s.AnZhaung(c);
s.Print("小王");
Heise h=new Heise();
s.AnZhaung(h);
s.Print("最帅");
}
}



