java三大特性:封装、继承、多态

继承


一、目的:实现代码的复用

二、简单例子(A继承了C):
public class A extends C {

	//检测哪些可以在子类里使用
public void test22(){ //int aa = a;private报错,权限不可见(编译不通过) int bb = b;//默认(包)访问权限的因为和父类在同一个包所以通过,否则不通过 int cc = c;//protected的(编译通过) int dd = d;//public的(编译通过)
}
} class C{
private int a;
int b;
protected int c;
public int d;
}

三、继承的本质


这个得从两个角度讲:继承语法角度 和 内存实现角度

1.对于继承语法角度(来自oracle的java语言规 范

Members of a class that are declared private are not inherited by subclasses
of that class.

Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is 
declared.

Constructors, static initializers, and instance initializers are not members and 
therefore are not inherited.(构造器、静态初始化块、实例初始化块不继承)

2.然而,从内存实现角度。

子类是“继承”了父类全部,更具体的,如《java编程思想》129页里写道:
  创建导出类时,该导出类对象会包含基类的子对象。只是说这个子对象不全对外开放(开放多少?根据访问修饰符决定)。
根据访问修饰符,子类和父类如果:
--1在同一个包:public,protected,默认访问级别(包访问级别) 三种类型
--2不在同个包: public,protected 两种

四、基本语法

(1)Java不支持多继承,也就是说子类至多只能有一个父类(但可以有多个间接父类,比如所有类都直接或间接继承自Object类)。

(2)super与this:
在子类变量或方法 与 父类重名时,可用super this特指区分。super还可用来访问 子类对象持有的父
类子对象的构造器、变量等。(由于子类对象持有父类子对象的特性,静态域不能使用super)

(3)构造器不能被继承,但是子类初始化前一定要(或自动)被调用。

(4)多次讲解和访问修饰符有关,贴出下图关系:

访问权限   类   包  子类  其他包

public       ∨   ∨   ∨     ∨

protect     ∨   ∨   ∨     ×

default    ∨   ∨   ×     ×

private     ∨   ×   ×     ×

四、方法的重载和覆盖(或者说重写,一个意思)

(1)方法重载(Overload)


定义:对于类的方法(包括从父类中继承的方法),如果有两两个方法的方法名相同,但参数列表(参数的顺序也得考虑)不一致,那么可以说一个方法是另个的重载。

必须满足的条件:
--方法名相同
--参数列表(类型,个数或顺序)不同
--返回值类型可以不同(不能以返回值区分重载!)
--方法的修饰符可以不同

(2)方法重写(覆盖)(Override)

定义:子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型相匹配,那么可以说,子类方法覆盖了父类的方法

必须满足的条件(来自《java面向对象编程》):
1.名称、参数签名和返回类型相同。子类方法的返回值与父类必须相同。

2.方法覆盖中子类方法不能缩小父类方法的访问权限。例如父类方法是public的,子类方法不能是默认修饰,protected,private修饰。(防止与多态冲突)

3.子类方法不能抛出比父类方法更多的异常。

4.方法覆盖只能是在子类和父类之间,同一个类中只能是方法重载。

5.父类的静态方法不能被覆盖成非静态方法。

6.子类可以覆盖父类中的静态方法,用以屏蔽父类中的静态方法。

7。父类的非静态方法不能被子类覆盖为静态方法。

8.父类的私有方法不能被子类覆盖。

9.父类的抽象方法可以被子类通过两中途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。

10.父类的非抽象方法可以被子类覆盖成抽象方法。

(3)覆盖与重载的异同



五、继承的缺陷

1、继承破坏了封装(最大的缺陷)。于父类而言,它的实现细节对于子类来说都是透明的。

2、父类变,子类就必须变。

3、继承是一种强耦合关系。

所以说当我们使用继承的时候,我们需要确信使用继承确实是有效可行的办法。那么到底要不要使用继承呢?《Think in java》中提供了解决办法:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。

      慎用继承!


参考:

1.《java面向对象编程》孙卫琴

2.《java编程思想》

3.http://blog.csdn.net/chenssy/article/details/12785831utm_source=itdadao&utm_medium=referral

4.http://blog.csdn.net/nanruitao10/article/details/52635038?

Java总结---继承(不断完善ing..)的更多相关文章

  1. Java的继承、封装与多态

    Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...

  2. java基础-继承

    浏览以下内容前,请点击并阅读 声明 一个由其他类继承的类叫子类(也叫继承类,扩展类等),该类继承的类叫父类或超类.除了Object类意外,所有的类都有切仅有一个父类,如果一个类没有用extends关键 ...

  3. Java面向对象㈡ -- 继承与多态

    Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口).Java继承有一个关键字super是用来指向父类.Java继承衍生出覆 ...

  4. java的继承机制

    这次我想深入探究以下java里类的继承机制.       我们知道,继承是java设计里的一个失败的地方.高司令说过:如果让他重新设计java的话,他会把继承去掉.而java里继承到底怎么了,会这么不 ...

  5. Java面向对象 继承(下)

     Java面向对象   继承(下) 知识概要:               (1)抽象类 1.1 抽象类概述                            1.2 抽象类的特点       ...

  6. Java面向对象 继承(上)

       Java面向对象 继承 知识概要:         (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...

  7. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

  8. Java开发知识之Java的继承多态跟接口*

    Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...

  9. JAVA通过继承线性表来实现有序表

    1,对于线性表而言,里面的元素是无序的,可以随意地将新元素增加到线性表中而不需要考虑该元素在线性表中的位置.但是,对于有序表而言,其中的元素是按照某种方式进行排序的,因此在有序表中插入元素时,需要按照 ...

  10. java中继承thread类的其他类的start()方法与run()方法

    java中继承thread或者实现runnable接口的类必须重写run()方法. 如果其执行了start()方法,其实就是启动了线程的run()方法. 注意:如果是实现runnable接口的类是没有 ...

随机推荐

  1. 【UEFI】---BIOS中UserPassword的重复校验总结

    UEFI作为目前较为流行的一套X86架构初始化的标准框架,已受到业界内的广泛认可.而其中很多编程所采用的思想确实值得学习.今天总结下UEFI的框架下修改代码的一点小经验,仅供菜鸟参考. 先列干货,具体 ...

  2. FreeSql (一)入门

    FreeSql 是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.5+(QQ群:4336577) FreeSql采用MIT开源协议托管 ...

  3. Net基础篇_学习笔记_第九天_数组_冒泡排序(面试常见题目)

    冒泡排序: 将一个数组中的元素按照从大到小或从小到大的顺序进行排列. for循环的嵌套---专项课题 int[] nums={9,8,7,6,5,4,3,2,1,0}; 0 1 2 3 4 5 6 7 ...

  4. git的几个小技巧

    git的几个小技巧 分享git的几个小技巧,后面会根据使用补充.目前包括git撤销本地修改.git回退到前n个版本.git多用户提交冲突解决.git 命令简化.欢迎大家补充^_* 1.git撤销本地修 ...

  5. Kubernetes v1.16 发布 | 云原生生态周报 Vol. 20

    作者:心贵.进超.元毅.心水.衷源.洗兵 业界要闻 Kubernetes v1.16 发布 在这次发布中值得关注的一些特性和 Feature: CRD 正式进入 GA 阶段: Admission We ...

  6. Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理

    博客地址:http://www.moonxy.com 一.前言 在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 ...

  7. Linux 笔记 - 几个常用且重要的命令

    博客地址:http://www.moonxy.com Linux 系统中提供了大量的命令,从文件目录管理,用户管理,到系统监控等等,功能非常丰富,但有几个是常用且重要的命令. 1. 命令 grep 作 ...

  8. git windows 安装 - Github同步 / Vscode源代码管理:Git 安装操作

    github上创建立一个项目 登录github网站,在github首页,点击页面右下角"New Repository" 最后点击"Create Repository&qu ...

  9. Promise核心原理解析

    作者: HerryLo 本文永久有效链接: https://github.com/AttemptWeb...... Promises对象被用于表示一个异步操作的最终完成 (或失败), 及其结果值.主要 ...

  10. 第六届蓝桥杯java b组第四题

    第四题 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153….. 其循环节为[846153] 共有6位. 下面的方法,可以求出循环 ...