java面向对象——多态
一、 多态的概念。
多态是面向对象程序设计三大特性之一。是指面向对象程序运行时,相同的信息可能会送给多个不同的类型之对象,而系统可依据对象所属类型,引发对应类型的方法,而有不同的行为。简单来说,所谓多态意指相同的信息给予不同的对象会引发不同的动作称之。
多态的前提是继承或都实现。换句话说,没有了继承和实现,多态就无从说起。
二、 抽象类实现多态的举例。
例一:
像机的用途是用来拍照。但是在不同年代相机的拍照功能是不同的。如七八十年代的想机图像存放的地方是胶卷,而现代的相机图像存放的地方内存卡。它的实现都各不相同,查看所拍照的照片也各不相同。我们开发才能使同样的硬件实应不同的时代呢。用java类实现以上描绘。如下:
//相机类
abstract class Camera
{
public abstract void photoGraph();//不同年代的相机有不同的拍照方式
public abstract void storage();//不同年代有不同的照片存储方式。
public abstract void seePhoto();//不同年代的相机查看照片的方式不同。
}
class OddCamera extends Camera//以前的相机
{
public void photoGraph()
{
System.out.println("老的相机拍照后拉胶卷");
}
public void storage()
{
System.out.println("照片暴光存储在胶卷中");
}
public void seePhoto()
{
System.out.println("把一卷胶卷拍完后,取出来洗就可以看了");
}
}
class NowCamera extends Camera//现代相机
{
public void photoGraph()
{
System.out.println("现代的相机拍照直接按拍照按钮");
}
public void storage()
{
System.out.println("现代相机拍照后,把信息存储在存储卡中");
}
public void seePhoto()
{
System.out.println("按预览键就可以在相机屏幕上查看照片");
}
}
class FutrueCamera extends Camera//未来相机
{
public void photoGraph()
{
System.out.println("未来的相机拍照是相机自动识别");
}
public void storage()
{
System.out.println("未来相机拍照后,把信息发送到互联网上共享");
}
public void seePhoto()
{
System.out.println("在电脑上查看照片");
}
}
class DuTaiClientDemo
{
public static void main(String[] args)
{
Camera c=null;
//以前的相机
System.out.println("-----------------老相机--------------------");
c=new OddCamera();
c.photoGraph();
c.storage();
c.seePhoto();
//现代相机
System.out.println("-----------------现代相机--------------------");
c=new NowCamera();
c.photoGraph();
c.storage();
c.seePhoto();
//未来的相机
System.out.println("-----------------未来相机--------------------");
c=new FutrueCamera();
c.photoGraph();
c.storage();
c.seePhoto();
}
}
程序运行结果:
-----------------老相机--------------------
老的相机拍照后拉胶卷
照片暴光存储在胶卷中
把一卷胶卷拍完后,取出来洗就可以看了
-----------------现代相机--------------------
现代的相机拍照直接按拍照按钮
现代相机拍照后,把信息存储在存储卡中
按预览键就可以在相机屏幕上查看照片
-----------------未来相机--------------------
未来的相机拍照是相机自动识别
未来相机拍照后,把信息发送到互联网上共享
在电脑上查看照片
实例一所示,同样的一个相机对象c有老相机的状态,现代相机的状态,未来相机的状态。这就是多态的表现。
实例二:
我们还可以生产一个象相适配器,当像相随着时代的进步而不会被淘汰。有了适配器,我们只要把现代相关的技术装上去就可以了。代码如下:
class AdapterCamera
{
public void adapter(Camera c,String CameraType)
{
System.out.println("-----------------"+CameraType+"--------------------");
c.photoGraph();
c.storage();
c.seePhoto();
}
}
class DuTaiClientDemo
{
public static void main(String[] args)
{
AdapterCamera ap=new AdapterCamera();
Camera oddCamera=new OddCamera();
Camera nowCamera=new NowCamera();
Camera futureCamera=new FutrueCamera();
ap.adapter(oddCamera,"老相机");
ap.adapter(nowCamera,"现代相机");
ap.adapter(futureCamera,"未来相机");
}
}
我们再来看看,适配器中也用到了多态。利用了多态,我们就可以实现了代码的复用,简化了代码的数量,降底了代码的藕合度。使程序易于扩展。
上面的适配器里是不是什么都可以传呢,不是的,只能传递的类型是Camera类型的。传其他类型装发生无法转换的异常。如:
class DuTaiClientDemo
{
public static void main(String[] args)
{
AdapterCamera ap=new AdapterCamera();
Camera oddCamera=new OddCamera();
Camera nowCamera=new NowCamera();
Camera futureCamera=new FutrueCamera();
ap.adapter(oddCamera,"老相机");
ap.adapter(nowCamera,"现代相机");
ap.adapter(new Object(),"未来相机");
}
}
我们new了一个Object类型的过去,程序编译时发生异常。如下:
G:\studyjava>javac DuoTaiDemo.java
DuoTaiDemo.java:96:无法将 AdapterCamera中的 adapter(Camera,java.lang.String)
应用于 (java.lang.Object,java.lang.String)
ap.adapter(new Object(),"未来相机");
^
1错误
对于种情况,我们就需要使java关键字(instanceof)进行判断,如果是Camera类行时才执行,否则报错。代码如下:
class AdapterCamera
{
public void adapter(Camera c,String CameraType)
{
if(c instanceof Camera)
{
System.out.println("-----------------"+CameraType+"--------------------");
c.photoGraph();
c.storage();
c.seePhoto();
}
else
{
System.out.println("不是相机类型");
}
}
}
三、 接口实现多态的实例。
例一:我们在公共场所经常看到“非工作人员勿进”,我们就用java语言来描述这一句话。如下:
//工作人员。
interface IWorker//工作人员
{
public void credentials();//工作证件
public void work();//工作
}
class WorkHome//工作室
{
public void door(IWorker worker)
{
worker.credentials();
worker.work();
}
}
//实现了张三这个工作者
class ZhangShan implements IWorker
{
public void credentials()
{
System.out.println("张三带上自己的工作证");
}
public void work()
{
System.out.println("张三在工作中.........");
}
}
//实现了李四这个工作者
class LiShi implements IWorker
{
public void credentials()
{
System.out.println("李四带上自己的工作证");
}
public void work()
{
System.out.println("李四在工作中.........");
}
}
//实现了王五这个工作者
class WangWu implements IWorker
{
public void credentials()
{
System.out.println("王五带上自己的工作证");
}
public void work()
{
System.out.println("王五在工作中.........");
}
}
class InterfaceWorkHomeDemo
{
public static void main(String[] args)
{
WorkHome workhome=new WorkHome();
ZhangShan z=new ZhangShan();
LiShi l=new LiShi();
WangWu w=new WangWu();
workhome.door(z);
workhome.door(l);
workhome.door(w);
}
}
结果输入为:
张三带上自己的工作证
张三在工作中.........
李四带上自己的工作证
李四在工作中.........
王五带上自己的工作证
王五在工作中.........
工作室的类的door传入的参数是接口Iworker类型。让其实现接口的子类以参数传递过来。这就是利用了多态的结。不能型态对应着不周的方法,从而有不周的表现。
四、 使用多态主意的事项。
1)基实多态就是通过继承父类,然后在子类中重写父类的非私有方法。然后在把子类赋值给父类(类型自动提升)然后父类调用的方法,就是子类实现的方法,如此来实现多态。
2)多态的前提必须有继承。没有继承关系,就无从谈起。
3)在继承并重写或覆盖父类的方法时,子类传入的参数可以被缩小(类型本身或其子类型)
4)在继承并重写或覆盖父类的方法时,返回类型可以被放大(类型本身或其父类)
5)子类不能重写父类的私有成员方法,即使定义了,也只说明是重新在子类中定义一个新方法而已。
6)重写或覆盖父类的方法时,如果父类的方法带有返回值,子类也一定带有返回值。
7)重写或覆盖父类的方法时,如果父类的方法抛出异常,那么子类要么声明为异常本身、子类或没有。如果父类方法没有抛出异常,那么子类不得抛出任何异常。
8)子类不能重写父类用final悠饰的的方法。
9)子类不能继承至用final修饰的类。因为此种类不能被继承。