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 面对对象(抽象 继承 接口 多态)
什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...
随机推荐
- VS 快捷键(待完善)
本人使用的是VS2010版本的 感觉还算稳定. 快捷键: 1. Ctrl+E,U 用于对选中的代码行快速对齐: 2. Ctrl+R,E 用于对象属性的重构,比如对get,set属性的快速设置. 方法: ...
- SQL 使用 AND 与 OR
1.介绍:关于AND与OR的使用是比较基础的,但是在项目中如果不注意使用的话会使查出来的数据有错误. 2.主要问题: 在未加任何AND与OR的选择是独立的,与逻辑运算一样.即: SELECT * FR ...
- ARM11 S3C6410 硬件浮点(VFP)实现
http://blog.csdn.net/liujia2100/article/details/7459683 在调试一个代码时,编译能顺利编过.可是,就是不能执行.找了半天才发现,原来是浮点问题.由 ...
- 一般多项式曲线的最小二乘回归(Linear Regression)
对于一般多项式: K为多项式最高项次,a为不确定的常数项,共k+1个; 有离散数据集对应,其方差: β为,方差函数S对β自变量第j个参数的梯度(偏导数): 当以上梯度为零时,S函数值最小,即: 中的每 ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- Debian 8下vsftpd安装与配置
Debian 8下vsftpd安装与配置 0.环境 root@remote:/# uname -r 3.16.0-4-amd64 root@remote:/e# lsb_release No LSB ...
- svn+ssh方式svn服务器和客户端的配置[转载]
本文摘自:http://hi.baidu.com/farmerluo/item/e7d9d72d098afc0a42634abb 我们最近一个项目用的那几台服务器都是客户给的,但是管理非常严格,只给我 ...
- git ignore
我最初将整个项目push到远程仓库,但是项目代码里面有大文件,从而传输太费时间了. 看网上的说法,可以通过ignore文件达到不提交某些文件的效果,尝试了一下发现不行. 后来尝试清除缓存 $ git ...
- ANSI C 所有的转义字符
\a 响铃符 \b 回退符 \f 换页符 \n 换行符 \r 回车符 \t 横向制表符 \v 纵向制表符 \\ 反斜杠 \? 问号 \' 单引号 \" 双引号 \000 八进制数 \xhh ...
- 如何编写高效的jQuery代码
jQuery的编写原则: 一.不要过度使用jQuery 1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大.所以有原生方法可以使用的场 ...