Java中类继承、接口实现的一些细节(长期更新)
前言
在Java中,子类继承父类,类实现接口是属于常识性的内容了,作为一个Java程序员应该也比较熟悉。不过子类继承父类,类实现接口中还是有一些小细节值得注意一下,本文就从个人工作、学习中入手,总结一些细节性的内容,以更进一步地掌握继承、实现的关系。现在只是写一些目前碰到的内容,以后只要想到了、碰到了任何继承、实现相关问题,都会保持更新此文。
接口A有void C()方法,接口B有int C()方法,则无法同时实现这两个接口
Java为了弥补类单继承的不足,引入了类多实现接口的机制,不过多实现某个接口也是有一定限制的,比如:
public interface A
{
void C();
}
public interface B
{
int C();
}
那么同时实现这两个接口是不可能的:

这个错误是无法被修复的。试想,类AB实现接口A和接口B,那么接口A里面的抽象方法和接口B里面的抽象方法参数列表都相同仅有返回值不同,类AB应该实现哪个呢?实现接口A的"void C()",那么接口B的"int C()"怎么办?实现接口B的"int C()"那么接口A的"void C()"怎么办?因为"void C()"、"int C()"属于方法参数相同,返回值不同,这两个方法是不可以重载的,所以同时实现两个方法也不可能。因此,在这里Java只能报错了。
A是接口,B实现A,C继承B,则C也是A的子类
有一个接口A,B实现了A接口,C继承自B类,则C也是A的子类,看一下:
public interface A
{ }
public class B implements A
{ }
public class C extends B
{ }
public static void main(String[] args)
{
C c = new C();
System.out.println(c instanceof A);
}
返回结果是true。这是一个不难理解的结论,想到求证这个结论是因为有一次在研究LinkedHashMap的时候:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
既然LinkedHashMap已经继承了HashMap了,HashMap是Map的实现类,那为什么LinkedHashMap还要实现Map呢,岂不是多此一举吗?由此想到了会不会是因为继承了HashMap不代表LinkedHashMap是Map的子类所以LinkedHashMap要专门再实现一下Map,做了上面的实验,发现是我多虑了,可能Sun的开发人员就想这么写吧,呵呵。
父子类中有同名属性
这不是错误,只是会造成歧义而已,而且也可能会造成返回我们不想要的结果,主要原因可能是开发者对父类代码不熟悉所导致的(尤其是在父类定义的属性一大堆的场景下)。举个例子:
public class Father
{
private int i; public Father()
{ } public Father(int i)
{
this.i = i;
} public int getFatherI()
{
return i;
}
}
public class Son extends Father
{
private int i; public Son(int i)
{
super(100);
this.i = i;
} public int getSonI()
{
return i;
}
}
public static void main(String[] args)
{
Son son = new Son(50);
System.out.println("Son getFatherI():" + son.getFatherI());
System.out.println("Son getSonI():" + son.getSonI());
}
运行结果为:
Son getFatherI():100
Son getSonI():50
提出这个问题是因为我们担心父子类的同名属性会不会存在覆盖的情况,从运行结果来看,完全不用担心这个问题。
一个实现类继承自一个抽象类并且实现了多个接口,那么必须实现所有未被实现的抽象方法
举个例子:
public interface InterfaceA
{
void A1();
void A2();
}
public interface InterfaceB
{
void B1();
void B2();
}
public abstract class AbstractC implements InterfaceA, InterfaceB
{
public void A1(){} // 我实现了InterfaceA的A1()方法
public void B2(){} // 我实现了InterfaceB的B2()方法 abstract void C(); // 我自己定义了一个抽象方法
}
那么要定义一个ClassD继承自AbstractC,则必须:
public class ClassD extends AbstractC
{
public void A2(){} // 我必须实现InterfaceA中未被实现的A2()方法 public void B1(){} // 我必须实现InterfaceB中未被实现的B1()方法 void C(){} // 我必须实现AbstractC中未被实现的C()方法
}
Java中类继承、接口实现的一些细节(长期更新)的更多相关文章
- Java中类继承、接口实现的一些要注意的细节问题
1.接口A和接口B有相同的方法,只是返回值不同,则实现类不能同时实现这两个接口中的方法. 接口A有void C()方法,接口B有int C()方法,则无法同时实现这两个接口. Java为了弥补类单继承 ...
- java中类继承,到底继承了什么?
继承的最大好处就是为了实现代码的复用.那么,子类到底从父类得到的什么呢? 实例成员 父类的private成员不会被子类继承,子类不能访问.但是子类对象的确包含父类的私有成员. 父类的 包访问成员 继承 ...
- Java中类和接口
很形象的接口的使用——针对初学者 里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下. 我们拿人和程序员举个例子.人是一个大类,程序员是继承自人的子类.看 ...
- Java成神之路技术整理(长期更新)
以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 ...
- Java程序员必备的Intellij插件(长期更新,截止到2018-05-03)
善用Intellij插件可大幅提升我们的效率 以下是我用过不错的Intellij插件 1. .ignore 生成各种ignore文件,一键创建git ignore文件的模板,免得自己去写 截图: ...
- Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)
(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...
- Java中类的继承深入剖析
在Java开发中,我们常常用到继承这一概念,可以说继承是Java这类面向对象编程语言的基石.正是有了继承这个概念,使得我们可以创建分等级层次的类.今天小编就和大家一起来深入聊聊Java语言的继承. 在 ...
- Java之继承、抽象类、接口篇
一.继承(extends) 什么是继承? 继承是对现实生活中的"分类"概念的一种模拟. 狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是"继承" ...
- java 面对对象(抽象 继承 接口 多态)
什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...
随机推荐
- Shell文本处理 - 分割合并与过滤
sort分类操作 示例文件 Boys in Company C:HK:192:2192 Alien:HK:119:1982 The Hill:KL:63:2972 Aliens:HK:532:4892 ...
- Linux网络栈下两层实现
http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linu ...
- 20145229&20145316 《信息安全系统设计基础》实验三 实时系统的移植
实验封面 实验内容 1.安装ADS(安装文件在00-ads1.2目录下,破解方法00-ads1.2\Crack目录下) 2.安装GIVEIO驱动(安装文件在01-GIVEIO目录下) 3.把整个GIV ...
- centos安装lamp环境
通过yum安装,需要联网且为su账号 yum -y install httpd php mysql mysql-server php-mysql 设置开启启动mysql,httpd /sbin ...
- 纯css实现模块阴影变色效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spring 学习笔记 4. 尚硅谷_佟刚_Spring_属性配置细节
1,字面值 •字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入. •基本数据类型及其封装类.String 等类型都可以采取字面值注入的方式 •若字 ...
- 通过其他页面跳转到tableBar指示的界面
通过代理实现 让tableBar遵从代理,让代理的实现方法设置 [self setSelectedIndex:2]; setSelectedIndex:2 代表tableBar的item第3个处于选中 ...
- Python 6 —— 异常
Python 6 —— 异常 异常分类 AttributeError:调用不存在的方法 EOFError:遇到文件末尾引发异常 ImportError:导入模块引发异常 IndexError:列表越界 ...
- Discuz!X2大附件上传插件-Xproer.HttpUploader6
插件代码(github):https://github.com/1269085759/up6-discuz 插件代码(coding):https://coding.net/u/xproer/p/up6 ...
- 利用CSS3实现圆角的outline效果的教程
一.首先,outline是个很牛的东西1. border近亲outline和border是近亲,为什么这么讲呢?首先,都是给元素外面套框框的:其次,支持的属性值几乎都是一样的,例如,outline-s ...