美文网首页
java笔记--多态

java笔记--多态

作者: 吃饱喝足搬代码丶 | 来源:发表于2018-04-05 10:12 被阅读0次

对象的多态性

class 动物
{}
class 猫 extends 动物
{}

猫 x=new 猫();
动物 x=new 猫();一个对象,两种形态。

猫这类事物既具备猫的形态,又具备着动物的形态。这就是对象的多态性。

简单说:就是一个对象对应着不同类型

多态在代码中的体现

多态的好处:

提高了代码的扩展性,前期定义的代码可以使用后期的内容。

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("抓老鼠");
    }
}
public class DuoTai {

    public static void main(String[] args) {
        Cat c=new Cat();
        
        Dog d = new Dog();
//      c.eat();
        method(c);
        method(d);
        method(new Pig());
    }
    /*
    public static void method(Cat c){
        c.eat();
    }
    public static void method(Dog d){
        d.eat();
    }
    */
    public static void method (Animal a){//Animal a=new Cat()(或者new Dog()),这就是多态的使用
        a.eat();
    }
}

//后期的内容
class Pig extends Animal{
    void eat(){
        System.out.println("饲料");
    }
    void catchMouse(){
        System.out.println("拱白菜");
    }
}
运行: image.png

多态的弊端:

前期定义的内容不能使用(调用)后期子类特有的内容。

 public static void method (Animal a){//Animal a=new Cat()(或者new Dog()),这就是多态的使用
        a.eat();
        a.catchMouse();
    }

运行出错!!!

使用多态的前提:

1 必须有关系,继承,实现。
2 要有覆盖

转型:

public static void main(String[] args) {

        Animal a=new Dog();//自动类型提升,狗对象提升为动物类型。但是特有功能无法访问。
                           //作用就是限制对特有功能的访问。
                           //专业讲:向上转型。 
        a.eat()
        
        //如果还想用具体动物猫的特有功能。
        //你还可以将该对象进行向下转型。
        Dog d=(Dog) a;//向下转型是为了使用子类中的特有方法。
        d.eat();
        d.lookHome();
        //注意:对于转型,自始自终都是子类对象在做着变化
        /*
         Animal a1 =new Dog();
         Cat c1=(Cat) a1; 这样转型是不行的,运行出错
         */
        /*
         Animal a =new Animal();
         Cat c=(Cat) a; ClassCastException类型转换异常
         */
    }
运行: image.png

类型判断:instanceof

用于判断对象的具体类型,且只能用于引用数据类型判断
为了增强代码的健壮性

public class DuoTai {
public static void method (Animal a){//Animal a=new Cat()(或者new Dog()),也就是说接受的可能是cat或者dog
        a.eat();
        Cat c= (Cat) a;
        c.catchMouse();
    }
public static void main(String[] args) {
        method(new Cat());//可以运行
        method(new Dog());//出错:ClassCastException
    }
}

这时引入关键字instanceof,将method方法改为:

public static void method (Animal a){
        if(a instanceof Cat){//instanceof用于判断对象的具体类型
                             //通常在向下转型前用于健壮性的判断
        Cat c= (Cat) a;
        c.catchMouse();
        }else if(a instanceof Dog){
            Dog d=(Dog) a;
            d.lookHome();
        }
    }

调用:

public static void main(String[] args) {
        method(new Cat());//可以运行
        method(new Dog());//出错:ClassCastException
    }
运行: image.png

多态时,成员的特点:

1 成员变量:
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过;没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说,编译和运行都参考等号的左边。(Fu f=new Zi(); Zi z=new Zi();都参考左边的类)

2 成员函数(非静态):
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过;没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数
简单说:编译看左边,运行看右边

3 静态函数:
编译时:参考引用型变量所属的类中的是否有调用的静态方法
运行时:参考引用型变量所属的类中的是否有调用的静态方法
简单说,编译和运行都看左边。

其实对于静态方法,是不需要对象的。直接用类名调用

class Fu{
    int num =3;
    void show(){
        System.out.println("Fu");
    }
    static void method(){
        System.out.println("Fu static");
    }
}
class Zi extends Fu{// 这种继承模式开发中基本不出现,可能会面试
    int num=4;
    void show(){
        System.out.println("Zi");
    }
    static void method(){
        System.out.println("Zi static");
    }
}
public class DuotaiDemo {

    public static void main(String[] args) {
        Zi z=new Zi();
        System.out.println(z.num);
        //运行结果为 4
        Fu f=new Zi();
        System.out.println(f.num);
        //运行结果为 3
        f.show();//动态绑定到指定的对象上
        //运行结果为Zi,
        //若把Fu类中的show方法注释掉,则运行出错
        //若把Zi类中的show方法注释掉,则运行结果为Fu
        f.method();
        //运行结果为Fu static  静态调用不需要创建对象
    }
}
运行: image.png

相关文章

  • Java中的多态

    学习笔记:多态参考文章:Java多态的介绍[https://blog.csdn.net/newchitu/arti...

  • java面向对象,多态,抽象,接口

    day09笔记【java面向对象,多态,抽象,接口】 1 多态的概述及其代码体现 A:多态(polymorphic...

  • java笔记--多态

    对象的多态性 class 动物{}class 猫 extends 动物{} 猫 x=new 猫();动物 x=...

  • Java编程思想学习笔记(8)

    Java编程思想学习笔记(8) Java多态 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。 同时...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运行时...

  • 2018-01-25

    多态机制 java语言,实现多态...

  • java编程思想笔记--多态

    java编程思想笔记--多态 在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。​ ...

  • Java学习笔记------多态

    http://www.runoob.com/java/java-polymorphism.html 多态是同一个行...

  • Java学习笔记——多态

    多态:事物存在的多种形态。 Java中存在多态的前提条件: 要有继承关系 要有方法重写 要有父类引用指向子类对象 ...

网友评论

      本文标题:java笔记--多态

      本文链接:https://www.haomeiwen.com/subject/xcglhftx.html