Java 中extends与implements使用方法
Java 中extends与implements使用方法
版权声明:本文为博主原创文章,未经博主允许不得转载。
初学Java语言, 代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了。
- //定义一个Runner接口
- public inerface Runner
- {
- int ID = 1;
- void run ();
- }
- //定义一个interface Animal,它继承于父类Runner
- interface Animal extends Runner
- {
- void breathe ();
- }
- //定义Fish类,它实现了Animal接口的方法run()和breather()
- class Fish implements Animal
- {
- public void run () //实现了Animal方法run()
- {
- System.out.println("fish is swimming");
- }
- public void 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接口定义的方法。
- {
- System.out.println("the bird is running");
- }
- public void fly () //Flyer接口定义的方法。
- {
- 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 a = new B(); 结果a是一个A类的实例,只能访问A中的方法,那么又和A a = new A();有什么区别呢?
***********************************************************************************************
class B extends A
继承过后通常会定义一些父类没有的成员或者方法。
A a = new B();
这样是可以的,上传。
a是一个父类对象的实例,因而不能访问子类定义的新成员或方法。
***********************************************************************************************
假如这样定义:
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 中extends与implements使用方法的更多相关文章
- Java 中extends与implements使用方法 (转载)
转自:http://blog.csdn.net/chen_chun_guang/article/details/6323201 初学Java语言, 代码中的extends和implements让我感到 ...
- JAVA中extends 与implements区别
JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extend ...
- JAVA中extends 与implements有啥区别?
JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extend ...
- java中extends与implements的区别
学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...
- JAVA中extends 与implements的用法
1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重 ...
- java中extends和implements的区别
implements:接口 1.实现一个接口就是要实现该接口中的所有方法(抽象类除外) 2)接口中的方法都是抽象的 多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口 extends:继承父 ...
- JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac
记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...
- 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)
方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold&q ...
- Java中各种(类、方法、属性)访问修饰符与修饰符的说明
类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...
随机推荐
- IO操作概念。同步、异步、阻塞、非阻塞
“一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO. 阻塞IO和非阻塞IO的区别在于第 ...
- MS - 1 - 把二元查找树转变成排序的双向链表
## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10 ...
- PHP memory_get_usage()管理内存
PHP memory_get_usage()管理内存 我们在实际编码中,要想实现对内存的查看和操作,许多程序员们第一个想到的就是PHP memory_get_usage()这个PHP脚本内存函数. 下 ...
- 通过innobackupex实现对MySQL的增量备份与还原
备份 增量备份是基于完整备份的,所以我们需要先做一次完整备份: innobackupex --password=test /backup/ 备注:test是我的MySQL服务的root用户的密码,/b ...
- linux使用grep和find查找内容
1,在某个路径下查文件. 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录. find /etc -name “*” ...
- SSRS动态设置文本框属性
SSRS可以通过表达式动态设置文本框所有的属性,比如字体,字号,是否加粗,如下图所示: 汉字和数字英文字母占用的空间不一样,一个汉字占用两个数字和英文字母的空间,VB里有LENB取得字节数,这SSRS ...
- 如何让table中td宽度固定
table中td会随着里面的内容伸缩,设置其width样式并没有效果.这个时候需要下面的CSS可以实现. 首先是设置table .table {table-layout:fixed;} 其次是td . ...
- oracle SQLPLUS 常用set设置
SQL>set colsep' '; //-域输出分隔符 SQL>set echo off; //显示start启动的脚本中的每个sql命令,缺省为on SQL> set echo ...
- 第五章 征服数据库(Spring对DB的使用)——开发持久层
本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中, ...
- mysql高性能索引策略
转载说明:http://www.nyankosama.com/2014/12/19/high-performance-index/ 1. 引言 随着互联网时代地到来,各种各样的基于互联网的应用和服务进 ...