您的位置:首页 > 编程语言 > Java开发

Java-多态

2015-07-10 10:14 393 查看
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,通常这些方法都需要我们去重写

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: