继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承的特性

  • 子类拥有父类非 private 的属性、方法。

  • 子类可以拥有自己的属性和方法,可以对父类进行扩展。

  • 子类可以用自己的方式实现父类的方法。

  • Java 的继承是单继承,但可以多重继承。

  • 提高了类之间的耦合性。

继承关键字

继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。

extends关键字

在 Java 中,类的继承是单一继承,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

implements关键字

使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口。

super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

super 可用于:

  • 调用父类的构造方法;
  • 调用父类的方法(子类覆盖了父类的方法时);
  • 访问父类的数据域(可以这样用但没有必要这样用)。

this关键字:指向自己的引用。

可用于:

  • 调用当前类的构造方法,并且必须是方法的第一条语句。如:this(); 调用默认构造方法。this(参数); 调用带参构造方法。
  • 限定当前对象的数据域变量。一般用于方法内的局部变量与对象的数据域变量同名的情况。如 this.num = num。this.num 表示当前对象的数据域变量 num,而 num 表示方法中的局部变量。

final 关键字

final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写

构造器

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中,显式地通过 super 关键字调用父类的构造器,并配以适当的参数列表。

如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

重写(Override)与重载(Overload)

重写(Override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。

重写的好处在于子类可以根据需要,定义特定于自己的行为。

重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOException 的子类异常。

方法的重写规则

  • 参数列表与被重写方法的参数列表必须完全相同。

  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类。

  • 访问权限不能比父类中被重写的方法的访问权限更低。

  • 父类的成员方法只能被它的子类重写。

  • 声明为 final 的方法不能被重写。

  • 声明为 static 的方法不能被重写,但是能够被再次声明。

  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。

  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。

  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常。

  • 构造方法不能被重写。

  • 如果不继承一个类,则不能重写该类的方法。

重载(Overload)

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

最常用的地方就是构造器的重载。

重载规则:

  • 必须改变参数列表;
  • 可以改变返回类型;
  • 可以改变访问修饰符;
  • 可以声明新的或更广的检查异常;
  • 能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

区别

区别点 重载方法 重写方法
参数列表 必须修改 不能修改
返回类型 可以修改 不能修改
异常 可以修改 可以减少或删除,不能抛出新的或者更广的异常
访问 可以修改 不能做更严格的限制

总结

方法的重写(Overriding)和重载(Overloading)是多态的不同表现。

  • (1)重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同。

  • (2)重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法。

  • (3)重载是一个类的多态性表现,而重写是子类与父类的一种多态性表现。

Java 多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

重写

我们将介绍在 Java 中,当设计类时,被重写的方法的行为怎样影响多态性。

我们已经讨论了方法的重写,也就是子类能够重写父类的方法。

当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。

要想调用父类中被重写的方法,则必须使用关键字 super。

多态的实现方式

  • 重写

  • 接口

  • 抽象类和抽象方法

Java 封装

实现Java封装的步骤

  1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:
public class Person {private String name;private int age;
}

这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

  1. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
public class Person{private String name;private int age;public int getAge(){return age;}public String getName(){return name;}public void setAge(int age){this.age = age;}public void setName(String name){this.name = name;}
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

Java菜鸟教程系列 学习笔记总结 面向对象篇(1)相关推荐

  1. Java菜鸟教程系列 学习笔记总结 基础篇(1)

    基础语法 本博客通过学习菜鸟教程Java专栏,并整理得出的Java基础知识. 命名规范 1.项目名全部小写 2.包名全部小写 3.类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写.如: ...

  2. Java快速教程--vamei 学习笔记(基础篇)

    链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:ht ...

  3. python scrapy菜鸟教程_scrapy学习笔记(一)快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  4. 菜鸟教程-css3学习笔记

    学习链接是: https://www.runoob.com/css3/css3-tutorial.html ############################################## ...

  5. 菜鸟教程-css学习笔记

    CSS实例中有很多CSS的例子,可以学习. <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  6. 菜鸟教程-Javascript学习笔记-JS函数之前

    教程连接是: https://www.runoob.com/js/js-tutorial.html DOM(一些操作页面元素的方法) BOM(一些操作浏览器的方法) ################# ...

  7. 菜鸟教程PHP学习笔记(不定期更新)

    NO.1-PHP表单验证 代码详细注释版 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8&qu ...

  8. Java菜鸟到大牛学习路线之高级篇

    这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理. 01-java高级架构师设计-基础深入         J2SE深入讲解         Java多线程与并发 ...

  9. 菜鸟教程Cpp学习笔记

    一.面向对象开发的特征 面向对象开发的四大特性: 封装 抽象 继承 多态 二.C++ 中的类型限定符 限定符 含义 const const 类型的对象在程序执行期间不能被修改改变. volatile ...

最新文章

  1. 一个用于styleGAN图像处理的编码器
  2. 斯洛文尼亚接受BCH支付的商家达343家,日本和北昆士兰州对BCH接受度增长迅速
  3. 【Verilog HDL】参数(Parameter)的作用案例
  4. zabbix监控系统客户端安装
  5. IDEA打包成可执行的JAR包
  6. 文字创作类App分享-简书
  7. 做值钱的事比赚钱更有意义
  8. MySQL 修改数据
  9. spring boot ---- jpa连接和操作mysql数据库
  10. 计算机系统的组成doc,简述计算机系统的组成.doc
  11. 在建工地扬尘在线监控系统推荐_综执 | 针对工地扬尘、噪音监控系统问题对各在建工地开展集中约谈...
  12. 拓端tecdat|Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
  13. 181129每日一句
  14. c语言约瑟夫环分析报告,约瑟夫环C语言实现验证报告.doc
  15. 2020年中国人口出生率为8.52‰,首次跌破10‰,创下1978来新低
  16. 二级计算机excel以宏保存,excel宏保存 设置宏保存位置的操作方法
  17. 洛谷-3373 【模板】线段树 2
  18. kubesphere多节点在线安装
  19. 微信小程序页面元素居中布局
  20. 1688API详情接口调用示例

热门文章

  1. 『Java安全』Tomcat内存马_动态注册Listener内存马
  2. 警惕 NFT 中可能存在的骗局
  3. 系统心跳测试软件,心跳检测app
  4. 深度学习(Deep Learning)从零基础达到入门级水平
  5. matlab求心率变异性的程序,心率变异性及其相关算法实现_.ppt
  6. Matlab一元二次方程求根
  7. AE(ArcGIS Engine)的安装与配置(附加ArcGIS安装及所需安装包)
  8. 点击button会自动刷新页面??
  9. minio存储之纠删码(Erasure Code)
  10. 嵌入式linux之Nor/Nand FLASH的读写