Java:extends和implements的区别+用法
Java代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了。
[c-sharp] view plain copy
- //定义一个Runner接口
- public inerface Runner
- {
- int ID = 1;
- void run ();
- }
[java] view plain copy
- //定义一个接口Animal,它继承于父类接口Runner
- interface Animal extends Runner
- {
- void breathe ();
- }
[c-sharp] view plain copy
- //定义Fish类,它实现了Animal接口的方法run()和breather()
- class Fish implements Animal
- {
- public void run () //实现了Animal方法run()
- {
- System.out.println("fish is swimming");
- }
- public void breather() //实现Animal的breather()方法
- {
- System.out.println("fish is bubbing");
- }
- }
- //定义了一个抽象类LandAnimal,它实现了接口Animal的方法。
- abstract LandAnimal implements Animal
- {
- public void breather ()
- {
- System.out.println("LandAnimal is breathing");
- }
- }
- //定义了一个类Student,它继承了类Person,并实现了Runner接口的方法run()。
- class Student extends Person implements Runner
- {
- ......
- public void run ()
- {
- System.out.println("the student is running");
- }
- ......
- }
- //定义了一个接口Flyer
- interface Flyer
- {
- void fly ();
- }
- //定义了一个类Bird,它实现了Runner和Flyer这两个接口定义的方法。
- class Bird implements Runner , Flyer
- {
- public void run () //Runner接口定义的方法run()。
- {
- System.out.println("the bird is running");
- }
- public void fly () //Flyer接口定义的方法fly()。
- {
- System.out.println("the bird is flying");
- }
- }
- //TestFish类
- 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 {} (class 子类名 extends 父类名 implenments 接口名)
父类A与子类B继承关系上的不同:
A a = new B(); 结果a是一个A类的实例,只能访问A中的方法,那么又和A a = new A();有什么区别呢?
***********************************************************************************************
class B extends A
继承过后通常会定义一些父类没有的成员或者方法。
A a = new B();
这样是可以的,上传。
a是一个父类对象的实例,因而不能访问子类B定义的新成员或方法。
***********************************************************************************************
假如这样定义:
class A
{
int i;
void f(){}
}
class B extends A
{
int j;
void f(){} //重写
void g(){}
}
然后:
B b = new B();
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:extends和implements的区别+用法的更多相关文章
- java中extends与implements的区别
学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...
- java extends和implements区别
一.作用说明 extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 二.补充 JAVA ...
- java extend 和 implements 的区别
1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重 ...
- extends 与 implements 的区别
extends与implements是Java继承中使用的两个关键字,但extends与implements使用的情景不同: 1.接口继承接口,使用extends 2.类继承类时,用extends 3 ...
- extends 与implements的区别和用法
1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以 ...
- java中extends和implements的区别
implements:接口 1.实现一个接口就是要实现该接口中的所有方法(抽象类除外) 2)接口中的方法都是抽象的 多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口 extends:继承父 ...
- extends和implements的区别
extends表示继承 implements表示抽象类的接口
- Java 中extends与implements使用方法
Java 中extends与implements使用方法 标签: javaclassinterfacestring语言c 2011-04-14 14:57 33314人阅读 评论(7) 收藏 举报 分 ...
- Java 中的extends 和 implements
初学Java语言, 代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了. //定义一个Runner接口 public inerface Runner { ...
随机推荐
- SQL 四种连接查询(内连接、左连接、右连接、全连接)
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. (1) JOIN: 如果表中有至少一个匹配,则返回行(inner join) (2) LEFT JOIN: 即使右表中没有 ...
- 移动端JS判断手势方向
原生JS判断手势方向的解决思路: 1.滑动屏幕事件使用html5 的touchstart滑动开始事件和touchend滑动结束事件. 2.方向的判断,以起点做平面坐标系,与终点连线做直线,直线与x正半 ...
- MySQL (五)
1 连接查询简介 将多张表(可以大于2)进行记录的连接(按照某个指定的条件进行数据拼接). 最终结果:记录数可能会有变化,字段书一定会增加(至少两张表的合并). 连接查询:join,使用方式:左表 j ...
- Selenium1 Selenium2 WebDriver
1.Selenium 1 原理 (1).测试用例(Testcase)通过Client Lib的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接. 为什 ...
- 基于Grafana的Repeate Panel快速定义面板
Grafana提供的Repeate Panel功能,可以快速定义一类相同的面板. 一.定义模板变量 点击"设置"."模板",如下所示: 设置模板变量名称.类型. ...
- Win7怎么显示文件的后缀名
Win7怎么显示文件的后缀名.. --------------- -------------- --------------- -------------- --------------- ----- ...
- MySQL57安装教程
MySQL57安装教程... --------------------------- 首先需要下载MySQL57安装包: --------------------------------------- ...
- node中package.json全方面解析
Name 必须字段. 小提示: 不要在name中包含js, node字样: 这个名字最终会是URL的一部分,命令行的参数,目录名,所以不能以点号或下划线开头: 这个名字可能在require()方法中被 ...
- extjs6中grid里放置图片
1.加黑体的是实现代码,在view中操作 /** * Created by Wwei on 2017/7/1. */ Ext.define('Admin.view.userpanoram.UserPa ...
- hdu4746 Mophues
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其 ...