Java_extends与implements的区别.docx_第1页
Java_extends与implements的区别.docx_第2页
Java_extends与implements的区别.docx_第3页
Java_extends与implements的区别.docx_第4页
Java_extends与implements的区别.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA中extends 与implements有啥区别1. 在类的声明中,通过关键字extends来创建一个类的子类。一个类通过关键字implements声明自己使用一个或者多个接口。extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用2.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了比如class A extends B implements C,D,E=implements学了好久,今天终于明白了implements,其实很简单,看下面几个例子就ok啦接口的一些概念public inerface Runner int ID = 1; void run ();interface Animal extends Runner void breathe ();class Fish implements Animal public void run () System.out.println(fish is swimming);public void breather() System.out.println(fish is bubbing); abstract LandAnimal implements Animal public void breather () System.out.println(LandAnimal is breathing);class Student extends Person implements Runner . public void run () System.out.println(the student is running); . interface Flyer void fly ();class Bird implements Runner , Flyer public void run () System.out.println(the bird is running); public void fly () System.out.println(the bird is flying); class TestFish public static void main (String args) Fish f = new Fish(); int j = 0; j = Runner.ID; j = f.ID; 接口实现的注意点:a.实现一个接口就是要实现该接口的所有的方法(抽象类除外)。b.接口中的方法都是抽象的。c.多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。=extends与implements的不同 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重 继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了比如class A extends B implements C,D,E/ 一个类通过关键字implements声明自己使用一个或者多个接口。在类的声明中,通过关键字extends来创建一个类的子类。class 子类名 extends 父类名 implenments 接口名.=A a = new B(); 结果a是一个A类的实例,只能访问A中的方法,那么又和A a = new A();有什么区别呢?=class B extends A继承过后通常会定义一些父类没有的成员或者方法。A a = new B();这样是可以的,上传。a是一个父类对象的实例,因而不能访问子类定义的新成员或方法。=假如这样定义:class Aint i;void f()class B extends Aint j;void f()/重写void g()然后:B b = new B();b就是子类对象的实例,不仅能够访问自己的属性和方法,也能够访问父类的属性和方法。诸如b.i,b.j,b.f(),b.g()都是合法的。此时 b.f()是访问的B中的f()A a = new B();a虽然是用的B的构造函数,但经过upcast,成为父类对象的实例,不能访问子类的属性和方法。a.i,a.f()是合法的,而a.j,a.g()非 法。此时访问a.f()是访问B中的f()=A a = new B(); 这条语句,实际上有三个过程:(1) A a;将a声明为父类对象,只是一个引用,未分配空间(2) B temp = new B();通过B类的构造函数建立了一个B类对象的实例,也就是初始化(3) a = (A)temp;将子类对象temp转换未父类对象并赋给a,这就是上传(upcast),是安全的。经过以上3个过程,a就彻底成为了一个A类的实例。子类往往比父类有更多的属性和方法,上传只是舍弃,是安全的;而下传(downcast)有时会增加,通常是不安全的。=a.f()对应的应该是B类的方法f()调用构造函数建立实例过后,对应方法的入口已经确定了。如此以来,a虽被上传为A类,但其中重写的方法f()仍然是B的方法f()。也就是说,每个对象知道自己应该调用哪个方法。A a1 = new B();A a2 = new C();a1,a2两个虽然都是A类对象,但各自的f()不同。这正是1楼说的多态性的体现。这类问题在Java编程思想上都讲的很清楚 implements一般是实现接口。extends 是继承类。 接口一般是只有方法声明没有定义的,那么java特别指出实现接口是有道理的,因为继承就有感觉是父类已经实现了方法,而接口恰恰是没有实现自己的方法,仅仅有声明,也就是一个方法头没有方法体。因此你可以理解成接口是子类实现其方法声明而不是继承其方法。但是一般类的方法可以有方法体,那么叫继承比较合理。引入包可以使用里面非接口的一切实现的类。那么是不是实现接口,这个你自己决定,如果想用到那么你不是实现,是不能调用这个接口的,因为接口就是个规范,是个没方法体的方法声明集合。我来举个例子吧:接口可以比作协议,比如我说 一个协议是“杀人”那么这个接口你可以用 砍刀去实现,至于怎么杀砍刀可以去实现,当然你也可以用抢来实现杀人接口,但是你不能用杀人接口去杀人,因为杀人接口只不过是个功能说明,是个协议,具体怎么干,还要看他的实现类。那么一个包里面如果有接口,你可以不实现。这个不影响你使用其他类。implementsimplements是一个类实现一个接口用的关键字,他是用来实现接口中定义的抽象方法。比如:people是一个接口,他里面有say这个方法。public interface people() public say();但是接口没有方法体。只能通过一个具体的类去实现其中的方法体。比如chinese这个类,就实现了people这个接口。 public class chinese implements people public say() System.out.println(你好!);在java中implements表示子类继承父类,如类A继承类B写成 class A implements B与Extends的不同extends, 可以实现父类,也可以调用父类初始化 this.parent()。而且会覆盖父类定义的变量或者函数。这样的好处是:架构师定义好接口,让工程师实现就可以了。整个项目开发效率和开发成本大大降低。implements,实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。这两种实现的具体使用,是要看项目的实际情况,需要实现,不可以修改implements,只定义接口需要具体实现,或者可以被修改扩展性好,用extends。1、定义接口 使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:修饰符 interface 接口名 extends 父接口名列表public static final 常量;public abstract 方法;修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。方法:接口中的方法只有定义而没有被实现。例如,定义一个用于计算的接口,在该接口中定义了一个常量PI和两个方法,具体代码如下:javaview plaincopy1. publicinterfaceCalInterface2. 3. finalfloatPI=3.14159f;/定义用于表示圆周率的常量PI4. floatgetArea(floatr);/定义一个用于计算面积的方法getArea()5. floatgetCircumference(floatr);/定义一个用于计算周长的方法getCircumference()6. 注意: 与Java的类文件一样,接口文件的文件名必须与接口名相同。实现接口接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键字implements,其基本格式如下:修饰符 class extends 父类名 implements 接口列表修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。类名:必选参数,用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。extends 父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。implements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。 在类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。例如,编写一个名称为Cire的类,该类实现5.7.1节中定义的接口Calculate,具体代码如下:javaview plaincopy1. publicclassCireimplementsCalInterface2. 3. publicfloatgetArea(floatr)4. 5. floatarea=PI*r*r;/计算圆面积并赋值给变量area6. returnarea;/返回计算后的圆面积7. 8. publicfloatgetCircumference(floatr)9. 10. floatcircumference=2*PI*r;/计算圆周长并赋值给变量circumference11. returncircumference;/返回计算后的圆周长12. 13. publicstaticvoidmain(Stringargs)14. 15.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论