浅谈java中extends与implements的区别

Extends可以理解为全盘继承了父类的功能。implements可以理解为为这个类附加一些额外的功能;interface定义一些方法,并没有实现,需要implements来实现才可用。extend可以继承一个接口,但仍是一个接口,也需要implements之后才可用。对于class而言,Extends用于(单)继承一个类(class),而implements用于实现一个接口(interface)。

interface的引入是为了部分地提供多继承的功能。
在interface中只需声明方法头,而将方法体留给实现的class来做。
这些实现的class的实例完全可以当作interface的实例来对待。
在interface之间也可以声明为extends(多继承)的关系。
注意一个interface可以extends多个其他interface。

在类的声明中,通过关键字extends来创建一个类的子类。一个类通过关键字implements声明自己使用一个或者多个接口。extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法;implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用.

extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了;比如 class A extends B implements C,D,E;

学了好久,今天终于明白了implements(实现接口就是在接口中定义了方法,这个方法要你自己去实现,接口可以看作一个标准,比如定义了一个动物的接口,它里面有吃(eat())这个方法,你就可以实现这个方法implements,这个方法是自己写,可以是吃苹果,吃梨子,香蕉,或者其他的。IMPLEMENTS就是具体实现这个接口。),其实很简单,看下面几个例子就ok啦~v~ 接口的一些概念:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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的不同: 一个类通过关键字implements声明自己使用一个或者多个接口。在类的声明中,通过关键字extends来创建一个类的子类。

1
2
3
class 子类名 extends 父类名 implenments 接口名
{...
}

A a = new B(); 结果a是一个A类的实例,只能访问A中的方法。那么又和A a = new A();有什么区别呢?

class B extends A 继承过后通常会定义一些父类没有的成员或者方法。

A a = new B();这样是可以的,上传。a是一个父类对象的实例,因而不能访问子类定义的新成员或方法。


假如这样定义:

1
2
3
4
5
6
7
8
9
class A{
int i;
void f(){}
}
class B extends A{
int 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()不同。这正是的多态性的体现。
这类问题在《Java编程思想》上都讲的很清楚.

implements一般是实现接口。extends 是继承类。 接口一般是只有方法声明没有定义的,那么java特别指出实现接口是有道理的,因为继承就有感觉是父类已经实现了方法,而接口恰恰是没有实现自己的方法,仅仅有声明,也就是一个方法头没有方法体。因此你可以理解成接口是子类实现其方法声明而不是继承其方法。但是一般类的方法可以有方法体,那么叫继承比较合理。引入包可以使用里面非接口的一切实现的类。那么是不是实现接口,这个你自己决定,如果想用到那么你不是实现,是不能调用这个接口的,因为接口就是个规范,是个没方法体的方法声明集合。我来举个例子吧:接口可以比作协议,比如我说一个协议是“杀人”那么这个接口你可以用 砍刀去实现,至于怎么杀砍刀可以去实现,当然你也可以用抢来实现杀人接口,但是你不能用杀人接口去杀人,因为杀人接口只不过是个功能说明,是个协议,具体怎么干,还要看他的实现类。那么一个包里面如果有接口,你可以不实现。这个不影响你使用其他类。

implements是一个类实现一个接口用的关键字,他是用来实现接口中定义的抽象方法。比如:people是一个接口,他里面有say这个方法。public interface people(){ public say();}但是接口没有方法体。只能通过一个具体的类去实现其中的方法体。比如chinese这个类,就实现了people这个接口。

1
2
3
4
5
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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注意力机制 神经网络_图注意力网络(GAT)

引言作者借鉴图神经网络中的注意力机制,提出了图注意力神经网络架构,创新点主要包含如下几个:①采用masked self-attention层,②隐式的对邻居节点采用不同权重③介绍了多头注意力机制。 在作者的Introduction中,该论文…

java版问题

1.必填项在初次保存后应该已经有值了,怎么会加载数据又是空的的? 2.客户类型 企业性质? 一般机构、上市公司.... 3.文档管理-->上传文档,如果左侧选中文档节点时,上传文档时是否默认选中文档节点。 转载于:https:/…

html5标签属性大全_HTML5中video标签如何使用

HTML5中的video标签用于播放视频文件的,在video标签中我们可以设置窗口的宽高,视频的自动播放,循环播放以及视频的封面图片等等HTML5是下一代HTML,新增了许多新的标签,这些标签实现了许多新的功能。并且还减少了对外部…

Java中@Override的作用

Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1、可以当注释用,方便阅读; 2、编译器可以给你验证Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写Override,而你下面的…

java程序中用户名和密码_在Java应用程序中使用密码术

java程序中用户名和密码这篇文章描述了如何使用Java密码体系结构 (JCA),该体系结构使您可以在应用程序中使用密码服务。 Java密码体系结构服务 JCA提供了许多加密服务,例如消息摘要和签名 。 这些服务可通过特定于服务的API来访…

C++ setw和setfill

在C中&#xff0c;setw(int n)用来控制输出间隔。 例如: cout<<s<<setw(8)<<a<<endl; 则在屏幕显示 s a //s与a之间有7个空格&#xff0c;setw()只对其后面紧跟的输出产生作用&#xff0c;如上例中&#xff0c;表示a共占8个位置&#xff0c;不…

Linux快捷键

附上一些其他较长使用的快捷键&#xff1a; ctrl w —往回删除一个单词&#xff0c;光标放在最末尾 ctrl k —往前删除到末尾&#xff0c;光标放在最前面&#xff08;可以使用ctrla&#xff09; ctrl u 删除光标以前的字符 ctrl k 删除光标以后的字符 ctrl a 移动光标至的…

会python基础可以找到工作吗_我大学退学,现在 28 岁,如果零基础开始学 python,可以找到工作吗?...

作为一名IT行业从业者&#xff0c;同时也是一名教育工作者&#xff0c;我来回答一下这个问题。 首先&#xff0c;对于28岁且没有获得大学文凭的初学者来说&#xff0c;要想通过学习Python来找到工作还是具有一定难度的&#xff0c;一方面原因是目前开发岗位通常都有一定的学历要…

测试Java EE 8规范

Java EE 8平台肯定在过去的几个月中一直在发展。 规范已经发布了早期的草案评审&#xff0c;里程碑甚至最终版本。 实际上&#xff0c;随着JSF 2.3的发布&#xff0c;JSR-372才刚刚进入最终版本。 有关更多信息&#xff0c;请参见 Arjan的帖子 。 它有幸成为JSR-372专家组的成…

C++ this

对象a的内存地址和this指针的一模一样(都是0017F7E8)&#xff1b;而当运行到对象b的时候&#xff0c;它的内存地址又和它所对应的this指针指向的内存地址一模一样了(都是0017F7DC)。这就说明了this指针变量记录的是当前对象的内存地址&#xff0c;即this指针指向当前的对象

修改weblogic端口的方法

修改weblogic端口的方法 修改weblogic的端口常用的有两种方法 方法一.登录weblogic的console。如&#xff1a;http://localhost:7001/console/  1).在环境--服务器节点中点击你要修改的服务器的端口的名称(如下图&#xff1a;AdminServer(管理)) 2).上述步骤打开的页面如下图…

什么是JAX-RS注释? (第2部分)

JAX-RS注释概述&#xff08;第2部分&#xff09; 这是一个由三部分组成的系列&#xff0c;介绍了用于实现REST端点的注释。 在JAX-RS注释的第一部分中&#xff0c;您了解了&#xff1a; ApplicationPath批注 Path注释 GET HTTP方法注释 POST HTTP方法注释 PUT HTTP方法…

eclipse 快捷键组合

更多快捷键组合可在Eclipse按下ctrlshiftL查看。 让我们按照使用频率来看看我最爱用的一些热键组合。&#xff08;注&#xff1a;以下内容在Eclipse3.02及一上版本通过测试&#xff09; 1. Control-Shift-T: 打开类型&#xff08;Open type&#xff09;。如果你不是有意磨洋工…

java实体类转map_十五道经典面试题-JAVA基础篇

十五道JAVA基础面试题送给有需要的童鞋&#xff0c;但是不得不多提醒一句&#xff0c;打铁还需自身硬&#xff0c;计算机软件这个行业&#xff0c;技术和学历才是王道。好了&#xff0c;废话不多说&#xff0c;上菜&#xff1a;一&#xff1a;面向对象的特征有哪些方面 1. 抽象…

C++ 指针函数和函数指针

1、指针函数 &#xff08;1&#xff09;基本概念 指针函数&#xff1a;顾名思义就是带有指针的函数&#xff0c;即其本质是一个函数&#xff0c;只不过这种函数返回的是一个对应类型的地址。 &#xff08;2&#xff09;定义式 type *func(type , type) 如&#xff1a;int…

B树

B树是为磁盘或其他直接存储的辅存设备而设计的一种平衡搜索树。 B树类似于红黑树&#xff0c;但在降低磁盘I/O操作数方面要更好一些。许多数据库系统使用B树或者B树的变种来存储信息。 B树与红黑树的不同之处在于B树的结点可以有很多孩子&#xff0c;从数个到数千个。也就是说&…

如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

如何使用recaptchaCAPTCHA是一个程序&#xff0c;可以生成人类可以通过但计算机程序“ 不能 ”通过的测试并对其进行评分。 所采取的策略之一是向用户显示具有扭曲文本的图像&#xff0c;并且用户应在输入区域中书写文本。 如果显示的文字与用户输入的文字相同&#xff0c;则我…

micropython esp8266教程_(一)ESP8266/nodemcu如何使用MicroPython进行开发

简介 大家都知道ESP8266&#xff08;nodemcu&#xff09;可以使用arduino的语法&#xff08;C&#xff09;进行开发&#xff0c;也有些小伙伴可能也知道可以使用lua语言进行开发的。但是现在我们也可以使用python来开发esp8266&#xff08;nodemcu&#xff09;了。那么这篇教程…

PostGIS之路——几何对象编辑(二)

1、ST_Reverse返回几何对象顶点顺序相反的几何对象。geometry ST_Reverse(geometry g1);示例SQL&#xff1a;SELECT ST_AsText(the_geom) as line, ST_AsText(ST_Reverse(the_geom)) As reverselineFROM(SELECT ST_MakeLine(ST_MakePoint(1,2),ST_MakePoint(1,10)) As the_geom…

C++ cin.sync()和cin.ignore()

cin.sync()的功能是清空缓冲区&#xff0c;而cin.ignore()虽然也是删除缓冲区中数据的作用&#xff0c;但其对缓冲区中的删除数据控制的较精确。 有时候你只想取缓冲区的一部分&#xff0c;而舍弃另一部分&#xff0c;这是就可以使用cin.ignore()&#xff0c;其使用方法是&…