4.面向对象_继承

4.1继承的概述

  1. 提高了代码的复用性。
  2. 让类与类之间产生了关系,有了这个关系,才有多态的特性。

注意:千万不要为了获取其他类的功能而去继承,简化代码而继承。必须是类与类之间有所属关系才可以继承,所属关系 is a 。

Java语言中:Java只支持单继承,不支持多继承。因为多继承容易带来安全隐患。但多个父类定义了相同的功能时,当功能内容不同时,子类对象不确定实现哪一个。

但是Java保留这种机制,并用类一种体现形式来完成表现,多实现。Java支持多层继承。也就是一个继承体系。

如何使用一个体系中的功能呢?想要使用体系,先查阅体系父类的描述,因为父类中定义的是体系中最共性的功能,通过了解共性功能,就可以知道该体系的基本功能。那么这个体系已经基本可以使用了。

那么在具体调用时,要创建最子类的对象,为什么呢?一是因为有可能父类不能创建对象,二是因为创建子类对象可以获取更多功能,包括基本的也包括特有的。

简单一句话:查阅父类功能,创建子类对象,使用功能。

4.2继承的特点

子父类出现后:类成员的特点

  1. 变量
  2. 函数
  3. 构造函数

4.3super关键字

1、子父类中的变量:如果子父类中出现非私有的同名成员变量时,子类要访问本类的变量,用this;子类要访问父类中的同名变量时,用super。

super的使用和this的使用几乎一致。this代表的是本类对象的引用,super代表的是父类的引用。

4.4函数覆盖

2、子父类中的函数:当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容。如同父类的函数被覆盖和一样。这种情况是函数的另一个特性:重写(覆盖)

当子类继承父类,沿袭了父类的功能到子类中,但是子类虽然具备该功能,但是功能内部的内容却不一致,这是没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能的内容。

覆盖:1、子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。2、静态只能覆盖静态。

注意:重载:只看同名函数的参数列表。重写:子父类方法要一模一样。包括返回值类型。

4.5子类的实例化过程

3、子父类中的构造函数:在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();

super();会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();

为什么子类一定要访问父类中的构造函数?因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类中对这些数据是如何进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

注意:super 语句一定定义在子类构造函数的第一行。

结论:子类中所有的构造函数,默认都会访问父类中空参数的构造函数。因为子类每一个构造函数内都有一条隐式的语句super();,当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中最少有一个构造函数会访问父类中的构造函数,在子类构造函数中this语句和super语句只能存在一个

4.6final关键字

  • final可以修饰类、方法、变量
  • final修饰的类不可以被继承(限制全部),为了避免被继承,被子类复写功能。
  • final修饰的方法不可以被覆盖(限制局部),既可以修饰成员变量也可以修饰局部变量。
  • final修饰的变量是一个常量,只能被赋值一次。(当描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,方便于阅读,而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有的字母都要大写,如果由多个单词组成,单词间通过下划线_连接。)
  • 内部类只能访问被final修饰的局部变量

4.7 抽象类

当多个类中出现相同功能,但是功能主体不同,可以进行向上抽取。这时只抽取功能定义,而不抽取功能主体。抽象:看不懂。

抽象类的特点:

  1. 抽象方法一定在抽象类中;
  2. 抽象方法和抽象类都必须被abstract关键字修饰;
  3. 抽象类不可以用new创建对象,因为调用抽象方法没意义。
  4. 抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物。只不过该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,也需明确出现。但是无法定义功能主体。通过抽象方法来体现。

抽象类比一般类多了抽象方法。抽象不可以实例化。特殊:抽象类可以不定义抽象方法(目的:不让该类建立对象)。

模板方法模式:在定义功能时,功能的一部分是确定的(不想被子类复写用final修饰),但是有一部分是不确定的(当事物有默认的实现时,不一定用abstract修饰)。而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成。

4.8 接口

4.8.1接口的表现形式与类的关系

  • 格式:interface{}
  • 接口中的成员修饰符是固定的。
    • 成员变量:public static final
    • 成员函数:public abstract
  • 接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。

接口:是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化。否则子类也是一个抽象类。接口可以被类多实现,也是对多继承不支持的转换形式。Java支持多实现。

一个类继承了另一个类的同时还能实现多个接口。接口与接口之间存在多继承,类与类之间只支持单继承,类与接口之间存在多实现。

4.8.2接口的特点

  • 接口是对外暴露的规则
  • 接口是程序的功能扩展
  • 接口可以用来多实现
  • 接口于类之间是实现关系,而且类可以继承一个类的同时还能实现多个接口
  • 接口与接口之间可以有继承关系

黑马程序员_Java面向对象2_继承的更多相关文章

  1. 黑马程序员_Java面向对象_异常

    6.异常 1.异常: 就是程序在运行时出现不正常的情况.问题也是现实生活中一个具体的事物,也可以通过Java的类进行描述,并封装成对象.Exception和Error的子类名都是以父类名作为后缀名. ...

  2. 黑马程序员_Java面向对象3_多态

    5.面向对象_多态 多态定义:某一种事物存在的多种形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型. 猫 x = new 猫(); 同时猫也是动物的一种,也可以把猫称为动物. 动物 y = n ...

  3. 黑马程序员_Java面向对象1_封装

    3.面向对象_封装 3.1面向对象概念 3.1.1理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程:强调的是功能行为(执行者) 面向对象:将功能封装进对象,强调具备了 ...

  4. 黑马程序员_Java面向对象_内部类

    6.面向对象_内部类 1.内部类定义 内部类:将一个类定义在另一个类里面,对里面那个类就称为内部类.(内置类.嵌套类)内部类可以被私有修饰. 2.内部类访问规则 访问特点: 内部类可以直接访问外部类中 ...

  5. 黑马程序员_Java面向对象_包

    7.包 7.1包(package) 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称是:包名.类名. 包也是一种封装形式. 利用命令行自动生成文件夹格式:D:\jav ...

  6. 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表

    \day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...

  7. 黑马程序员_Java基础视频-深入浅出精华版--视频列表

    \day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...

  8. 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-

    \day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...

  9. 黑马程序员_Java基础:网络编程总结

    ------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...

随机推荐

  1. 【KMP】Number Sequence

    KMP算法 KMP的基处题目,数字数组的KMP算法应用. 主要是next[]数组的构造,next[]存储的是字符的当前字串,与子串前字符匹配的字符数. 移动位数 = 已匹配的字符数 - 对应的部分匹配 ...

  2. lesson4:利用jmeter来压测数据库

    本文讲述了如何利用jmeter来压测数据库,事例中选取了mysql作为测试数据库,其它的数据库也是一样,只需要更换驱动程序即可. 准备工作:a.mysql数据库安装,请自行百度:b.jdbc驱动包,请 ...

  3. Server Job: error: String or binary data would be truncated. The statement has been terminated.

    "String or binary data would be truncated. The statement has been terminated" most probabl ...

  4. Android adb

    查看原文:http://blog.csdn.net/u010818425/article/details/52266593 (一)基础操作 安装app adb install -r xxx.apk / ...

  5. 高速排序-c++(分别用数组和容器实现)

    /********************************************************************** *版权全部 (C)2014, cheng yang. * ...

  6. Linux CentOS PhpMyAdmin安装

    安装好PHP,Apache和MySQL程序后,为了管理MySQL数据库,我们需要安装phpMyAdmin程序.下面是关于如何在centos安装phpMyAdmin程序的方法.1.管理员root身份登录 ...

  7. OC基础 文件管理

    OC基础  文件管理 1.文件管理类NSFileManager对象的创建: NSFileManager *fm = [NSFileManager defaultManager]; 2.文件操作: (1 ...

  8. shell中的path expansion

    glob扩展 在shell中的路径扩展中,涉及到的glob有如下几种: ? 匹配任何单个字符 * 匹配0到多个字符 [set] 匹配任何一个在set当中的字符,如[0-9],则匹配任何一个数字 [!s ...

  9. jq:get获取json数据并以表格形式生成到页面

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. jQuery select 操作全集

    添加option $('#id').append("<option value="value">Text</option>");//为s ...