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,通常这些方法都需要我们去重写
版权声明:欢迎交流指正文章的错误,必定虚心接受,QQ872785786
原文地址:http://blog.csdn.net/qq_22075977/article/details/46827107