关闭

Java-多态

标签: Java多态
374人阅读 评论(0) 收藏 举报
分类:

Java-多态
一 多态的概念:
简单的说就是一件事物的不同表现形式,一个功能的不同种类的实现等等,类似于一对多的关系。

学习编程注重理解,不需要死记概念,只要理解了就行,能说出基本思想,能举例说明就可以了,开发过程中没有人叫你去写概念。

例如人分为男人和女人
动物有猫和狗等等

二 多态的特点
1,这些例子就是基本的体现
总结代码来说就是:
父类的引用指向了自己的子类对象

Animal a = new Cat();

那么a这个对象可以使用Cat的方法
父类的引用也可以接收自己的子类对象

2,多态的前提
必须是类与类之间有联系,要么继承,要么实现必须存在覆盖

3,多态的好处:
多态的出现大大的提高了程序的扩展性

4,多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员

5,多态的应用
主要是通过接口对象的引用来指向子类对象来实现多态。

在定义需要扩展不确定的功能的时候,通常定义功能的接口,
然后定义具体的功能类来实现这个接口

应用的实质特点是增强了程序的扩展性

6,下面是一个Demo:

/**
PCI接口类
*/
interface PCI
{
    public void open();
    public void close(); 
}
/**
主板类
*/
class MainBoard 
{
    public void run()
    {
        System.out.println("MainBoard is runing!"); 
    }
    //PCI p = new NewCard()接口型引用指向接口直接的子类对象
    public void userPCI(PCI p)
    {
        if (p != null)
        {
            p.open();
            p.close();

        } 
    } 
}

/**
网卡类
*/
class NetCard  implements PCI
{
    public void open()
    {
        System.out.println("NetCard is open!");

    }
    public void close()
    {
        System.out.println("NetCard is close!");

    } 
}
/**
声卡类
*/ 
class SoundCard  implements PCI
{
    public void open()
    {
        System.out.println("SoundCard is open!");

    }
    public void close()
    {
        System.out.println("SoundCard is close!");

    } 
}
/**
main
*/
public class ZhuBan
{
    public static void main(String[] args)
    {
        MainBoard m = new MainBoard();
        m.run();
        m.userPCI(new NetCard());
        m.userPCI(new SoundCard());  
    }   


}

可以直接检验运行结果
二 转型
类型提升是向上转型:

Animal a = new Cat();

如果要调用子类的特有方法的时候,
可以将父类引用,转换为子类类型,向下转型:

Animal a = new Cat();
Cat c = (Cat)a;

注意:千万不要出现将父类对象转成子类类型。
我们能够转换的是父类的引用指向的子类对象,注意是引用
这个引用可以被提升或者被降级
下面的代码不可以:

Animal a = new Animal();
Cat c = (Cat)a;

三 多态中特点
非静态成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
如有,编译通过,没有,编译失败
在运行时期:参阅对象所属的类中是否有调用的方法。

总结就是:非静态成员函数在多态调用的时候,
编译看左边的类中是否有相应方法,运行看右边类中相应的方法

非静态和静态成员变量的特点:
无论编译还是运行,都参阅左边的引用型变量所属的类中该变量的值

静态成员函数的特点:
无论编译还是运行,都参考左边
下面Demo是对上面理论的解释:

class Fu
{
    static int num = 5; 
    void method_1()
    {
        System.out.println("fu method_1");
    }
    void method_2()
    {
        System.out.println("fu method_2");
    }
    void method_3()
    {
        System.out.println("fu method_3");
    }
    static void method_4()
    {
        System.out.println("fu method_4");
    }

}

class Zi extends Fu
{
    static int num = 50; 
    void method_1()
    {
        System.out.println("zi method_1");
    }
    void method_3()
    {
        System.out.println("zi method_3");
    }
    static void method_4()
    {
        System.out.println("zi method_4");
    }
}





class Demo
{
    public static void main(String[] args) 
    {
        Fu f = new Zi();
        Zi z = new Zi();
        //1,父类中若没有method_3()编译会报错
        f.method_1();
        f.method_2();
        f.method_3();

        //2,静态的method_4()方法只运行左边的类的对象中的方法,即只参考左边的类
        f.method_4();
        z.method_4();

        //3,静态和非静态的成员变量都只参考左边的类,可以将num的static去掉再次运行
        System.out.println(f.num);
        System.out.println(z.num);

    }
}

四 多态之object类
object:是所有对象的直接或者间接的父类,该类中定义的肯定
是所有对象都具备的功能。
常用的有equal,toString,通常这些方法都需要我们去重写
这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:139241次
    • 积分:3119
    • 等级:
    • 排名:第12210名
    • 原创:209篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    博客专栏
    最新评论