java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态 性的实现。 一、通过继承中超类对象引用变量引用子类对象来实现 ...
java是面向对象的语言,而运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。 java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态 性的实现。
一、通过继承中超类对象引用变量引用子类对象来实现
举例说明:
1.//定义超类supera
2.class supera
3.{
4.int i = 100;
5.void fun()
6.{
7.system.out.println(“this is supera”);
8.}
9.}
10.//定义supera的子类subb
11.class subb extends supera
12.{
14.void fun()
15.{
16.system.out.println(“this is subb”);
17.}
18.}
19.//定义supera的子类subc
20.class subc extends supera
21.{
22.int n = 1;
23.void fun()
24.{
25.system.out.println(“this is subc”);
26.}
27.}
28.class test
29.{
30.public static void main(string[] args)
31.{
32.supera a;
33.subbb = new subb();
34.subcc = new subc();
35.a=b;//
36.a.fun();(1)
37.a=c;
38.a.fun();(2)
39.}
40.}
运行结果为:
this is subb
this is subc
上述代码中subb和subc是超类supera的子类,我们在类test中声明了3个引用变量a, b, c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。也许有人会问:“为什么(1)和(2)不输出:this is supera”。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是
在超类中定义过的,也就是说被子类覆盖的方法。
所以,不要被上例中(1)和(2)所迷惑,虽然写成a.fun(),但是由于(1)中的a被b赋值,指向了子类subb的一个实例,因而(1)所调 用的fun()实际上是子类subb的成员方法fun(),它覆盖了超类supera的成员方法fun();同样(2)调用的是子类subc的成员方法 fun()。
另外,如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性。具体的实现方法同上例。
不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了。
二、通过接口类型变量引用实现接口的类的对象来实现
接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。
举例说明:
1.//定义接口intera
2.interface intera
3.{
4.void fun();
5.}
6.//实现接口intera的类b
7.class b implements intera
8.{
9.public void fun()
10.{
11.system.out.println(“this is b”);
12.}
13.}
14.//实现接口intera的类c
15.class c implements intera
16.{
17.public void fun()
18.{
19.system.out.println(“this is c”);
20.}
21.}
22.class test
23.{
24.public static void main(string[] args)
25.{
26.interaa;
27.a= new b();
28.a.fun();
29.a = new c();
30.a.fun();
31.}
32.}
输出结果为:
this is b
this is c
上例中类b和类c是实现接口intera的两个类,分别实现了接口的方法fun(),通过将类b和类c的实例赋给接口引用a而实现了方法在运行时的动态绑定,充分利用了“一个接口,多个方法”展示了java的动态多态性。
需要注意的一点是:java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。
结束语:以上就是java运行时多态性的实现方法,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,毕竟java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
接口的声明和实现接口的概念Interface接口的声明接口的实现接口的程序设计举例接口的概念Interface 1.接口:用于声明一组类的公共操作的接口,Java中把对接口功能的继承称为实现(implement),接口只是声明了功能是...

接口的声明和实现

接口的概念Interface
1.接口:用于声明一组类的公共操作的接口,Java中把对接口功能的继承称为实现(implement),接口只是声明了功能是什么,而并没有定义如何实现该功能,功能的实现是在继承这个接口的各个子类中完成的
2.组成:接口往往由一组常量和抽象方法组成,一般不包括变量和有具体实现的方法
3.性质:支持多重继承
【注】接口与抽象类的区别:
(1)接口不能实现任何方法,而抽象类可以
(2)类可以实现许多接口,但只有继承一个父类
(3)接口不是类分级结构的一部分,没有联系的类可以实现相同的接口
接口的声明
定义接口的一般格式:
[public]interface 接口名[extends 父接口名列表]{[public][final][static] 类型 变量名= 常量值;//常量声明...[public][abstract] 返回类型 方法名(参数列表);//抽象方法声明...}
例如Shape的接口声明:
publicinterfaceShape{publicfinalstaticdouble PI=3.1416;publicabstractvoiddraw(Graphics g);}
接口的实现
实现接口一般格式:
classClassNameextendsParentClassimplementsinterface1,interface2 {...//接口中方法的实现}
接口的程序设计举例
Write a program to complete following tasks
(1)declare a interface name:Shape
public interface Shape
{
public double getArea(); //return the surface area of shape
public double getVolumn();
public double getName(); //return class name
}
(2)Define three classes Rectangle,Circle and Clinder to implements the following diagram
(3)Define a class named ShapeTest to test above classes
【输出结果】
Rectangle: area=6.00, Volumn=0.00
Circle: area=50.27, Volumn=0.00
Clinder: area=251.33, Volumn=235.62
此处给出主函数
publicclassShapeTest{publicstaticvoidmain(String[] args){ Shape s[]=newShape[3]; s[0]=newRectangle(2,3); s[1]=newCircle(4); s[2]=newClinder(5,3);for(Shape ele:s) System.out.printf("%s: area=%.2f,Volumn=%.2f\n",ele.getName(),ele.getArea(),ele.getVolumn());}}
以下给出完整代码
package ml;//该java程序在ml包里interfaceShape//接口的定义{publicdoublegetArea();publicdoublegetVolumn();public StringgetName();}classRectangleimplementsShape{privateint w;privateint l;publicRectangle(int wValue,int lValue){ w= wValue; l= lValue;}publicdoublegetArea(){return w*l;}publicdoublegetVolumn(){return0;}public StringgetName(){return"Rectangle";}}classCircleimplementsShape{privateint r;publicCircle(int rValue){ r= rValue;}publicdoublegetArea(){return Math.PI*r*r;}publicdoublegetVolumn(){return0;}publicdoublegetLength(){return2*Math.PI*r;}public StringgetName(){return"Circle";}}classClinderextendsCircle{privateint h;publicClinder(int r,int height){super(r); h= height;}publicdoublegetArea(){return2*super.getArea()+super.getLength()*h;}publicdoublegetVolumn(){returnsuper.getArea()*h;}}publicclassShapeTest{publicstaticvoidmain(String[] args){ Shape s[]=newShape[3]; s[0]=newRectangle(2,3); s[1]=newCircle(4); s[2]=newClinder(5,3);for(Shape ele:s) System.out.printf("%s: area=%.2f,Volumn=%.2f\n",ele.getName(),ele.getArea(),ele.getVolumn());}}
运行的结果为:
java 集合1.java存储对象的思路2.集合3.Collection接口4. Map接口 1.java存储对象的思路 存储对象可以考虑:①数组②集合 数组存储对象的特点:Student[] stu = new Student[20];stu[1] = new Stuednt(); ...

java 集合

1.java存储对象的思路

存储对象可以考虑:①数组②集合数组存储对象的特点:Student[] stu = new Student[20];stu[1] = new Stuednt();
弊端:①一旦创建,其长度不可变。②真实的数组存放的对象的个数是不可知。

2.集合

一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。
Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。
Java 集合可分为 Collection 和Map 两种体系
Collection接口:
Set:元素无序、不可重复的集合—类似高中的“集合”
List:元素有序,可重复的集合—”动态”数组
Queue:元素有序,先进先出
Stack:元素无序,先进后出 —是一个类
Map接口:
具有映射关系“key-value对”的集合 —类似于高中的“函数” y = f(x) (x1,y1) (x2,y2)

3.Collection 接口

Collection 接口的继承实现树
Collection接口的继承和实现类的UML图
Collection接口常用的方法

4. Map接口

Map接口的继承实现树
Map接口常用的方法
后续补充
Java继承Thread 实现Runnable接口和实现Callable接口创建线程的区别 mycsdn多线程:Java多线程 从实现方式来分可以分为两类:继承实现和接口实现,相较于继承,实现接口避免了单继承的局限性,所以较为常用。实现...
普通类继承,可以不用重写父类的方法,但是这会儿如果你new的是一个子类的对象,...**接口继承,**类似类的继承,可以不用重写父接口的方法,但是一个类如果要实现这个子接口,那么他就必须实现这个子接口和父接口...
java只支持单重继承,不支持多重继承,即一个类只能有一个父类,但是在实际应用中,又经常需要使用多重继承来解决问题,为了解决该问题,java提供了接口来实现多重继承功能。 【接口的简介】: 接口是一个抽象类,...
一个接口可以继承多个接口. interface C extends A, B {}是可以的. 一个类可以实现多个接口: ...在继承类的同时,也可以继承接口: class E extends D implements A,B,C{} 这也正是选择用接口而不是抽象类
继承好处就是父类方法可以重复使用 子类继承后调用就好了 可是父类有的方法设置为抽象的 意义何在 子类继承后还要重写抽象方法 不如不继承...还有接口 都是抽象的 ~~~实现了接口 还是要自己写方法~~ 一点没有省事情啊~~
2、如果是接口继承bai接口的话也du可以用extends,接口是多继承的,java类才是单继承; 3、接口继承接口可以不实现父接口中的方法,可以声明自己的新方法; 4、类实现接口时,一定要实现接口中声明的方法,如果...
今天尝试了在java中定义一个接口,一个父类
【JAVA集合】接口继承关系和实现 1接口继承关系和实现 集合类存放于Java.util 包中 ,主要有 3 种:set( 集)、list( 列表包含 Queue)和map(映射)。 Collection :Collection 是集合 List 、Set、Queue的最基本...
我们先来回顾下接口的相关知识接口是规范,用interface关键字修饰接口,接口是是一组抽象方法定义和常量的集合,接口间的继承是多继承关系。接口的定义public 接口名{/* 零个到多个的常量定义 零个到多个的抽象方法...
实现体现的是like a的关系,接口中一般定义的是整个继承结构的扩展功能;(例如回调,内名内部类只是需要实现一个回调最后执行的方法就可以,如果去继承了一个父类,太浪费了)接口是一个强制契约,要么不去实现...
c、java接口可以多继承。Interface3 Extends Interface0, Interface1, interface…… 不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定该继承那一个
在Java中,接口的实现和继承的实现很类似的,写法上是几乎是一致的,就是关键字这一部分不一样,即接口使用的关键字为implements,而继承使用的关键字为extends。代码如下:接口的代码: public class ...
【基础最重要】对java知识--继承与接口--的总结与回顾。温故而知新,可以为师矣
接口类似于类,但接口的成员没有执行...接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口。Java 接口本身没有任何实现,只描述 public 行为,因此Java 接口比Java 抽象类更抽象化。Jav...
在java语言中,类是单继承的,无法实现有多个父类的情况,但是接口很特殊,可以实现多继承,例如Interface2 extends Interface0, Interface1。java中不允许类多重继承,这样就不会有如果A同时继承B和C,而B和C同时有...
集合类存放于Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。 1. Collection:Collection 是集合 List、Set、Queue的最基本的接口。 2. Iterator:迭代器,可以通过迭代器遍历...
ava中线程的创建有两种方式: 1.通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 ...当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这
1.接口继承关系和实现 集合类存放于Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和map(映射)。 1. Collection:Collection 是集合 List、Set、Queue的最基本的接口。 2. Iterator:迭代器,...
泛型类和泛型接口被定义后,是可以被继承和实现的。 二 泛型类的继承 1代码 class A{ E t; } public class Bextends A{ public static void main(String[] args){ System....
当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface 定义接口使用的关键字不是class,是interface. 对于接口当中常见的成员:而且这些成员都有固定的修饰符 1...
在理解java集合框架和 Iterator Pattern的关联时遇到了接口的继承问题 这里写下对接口继承的个人理解,理解前需要补充接口和继承知识 什么是java接口Java接口是一系列方法的声明,是一些方法特征的集合,一个...
当一个类继承一个类,并且实现一个或者多个接口的时候,其中,父类和父接口中存在相同的方法。 如果子类中存在该方法的实现体或者说是覆盖,则使用该类的对象去掉用该方法时候,其实掉用的是来自接口的...