继承性
优点
- 减少了代码的冗余,提高代码的复用性
- 便于功能的扩展
- 为多态性的使用,提供了前提
格式
class A extends B { }
说明
- A:子类(派生类、subclass)
- B:父类(超类、基类、superclass)
- 子类A继承父类B中声明的所有的属性和方法
父类中声明为私有的属性和方法,子类继承父类后,仍然认为获取了父类中私有的结果,只是因为封装性的影响,使得子类不能直接调用父类的结构
- 子类继承父类后,还可以声明自己的特有的属性和方法,实现功能的扩展
子类与父类的关系
- 不同于子集与集合的关系
- 父类功能单一一些,子类具有可扩展性(extends:扩展,延展)
规定
- 一个类可以被多个子类继承(一个人可以有多个孩子)
- 类的单继承性:一个类只能有一个父类(一个孩子只能有一个父亲)
- 子父类是相对的概念
- 子类直接继承的父类叫直接父类,间接继承的父类叫做间接父类
- 子类继承父类后,获取了直接父类以及所有间接父类中声明的属性和方法
- 子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器
Object类
- 没有显式声明一个类的父类,此类继承于java.lang.Object类
- 所有的java类(除java.lang.Object类)都直接或间接的继承于java.lang.Object类
- 所有的java类具有java.lang.Object类声明的功能
概述
- 是所有Java类的根父类
- 如果在类的声明中未使用extends关键字指明父类,其默认父类为java.lang.Object类
- Object类只声明了一个空参构造器
功能
-
属性和方法具有通用性
-
属性:无
-
方法(主要)
equals( )
toString( )
getClass( )
hashCode( )
equals方法
运算符“==”
- 是一个运算符
- 使用在基本数据类型变量和引用数据类型变量中
- 如果比较基本数据类型变量,比较两个变量保存的数据是否相等
- 如果比较引用数据类型变量,比较两个对象的地址值是否相同(两个引用是否指向同一个对象实体)
- 使用时必须保证符号左右两边类型一致
equals方法
- 是一个方法
- 适用于引用数据类型
Object类中equals的定义

object类中定义的equals方法和==的作用是相同的(比较两个对象的地址值是否相同)
-
String、Data、File、包装类等都重写了Object类中的equals方法
-
重写equals方法
重写以后,通常比较两个对象的“实体内容”是否相同
可以手写,可以自动生成

-
任何情况下,x.equals(null)永远返回的是false
-
x.equals( 和x不同类型的对象)永远返回的是false
toString方法
当输出一个对象的引用时,实际上就是调用当前对象的toString( )
-
Object类中toString( )定义

-
像String、Date、File、包装类等都重写了Object类中toString方法
在调用对象的toString方法时,返回“实体内容”信息
-
自定义类也可以重写toString方法
调用此方法时,返回对象的“实体内容”

方法的重写(Override)
定义
- 子类继承父类以后,可以对父类中同名同参数的方法进行覆盖操作
- 重写后,当创建子类对象以后,通过子类对象调用子父类中的同名同参的方法时,实际执行的是子类重写父类的方法
规定
-
子类中的叫做重写的方法,父类中的称为被重写的方法
-
子类重写的方法中方法名和形参列表与父类被重写的方法的方法名和形参列表相同
-
子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
??注:子类中不能重写父类中声明为private权限的方法
-
返回值类型
-
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
-
父类被重写的方法的返回值类型是A类型(引用数据类型),则子类重写的方法的返回值类型可以是A类或A类的子类(引用数据类型)
-
父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型
例如父类中是double类型,子类也必须是double类型
-
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
-
子类和父类中同名同参的方法,要么都声明为非static(考虑重写),要么都声明为 static(不是重写)

输出为学生需要吃的很健康
super关键字
定义
使用
调用属性和方法
- 可以在子类的方法或构造器中,通过使用“super.属性”或“super.方法”的方式,显式的调用父类中声明的属性或方法(通常情况下省略这个“super.”)
- 当子类和父类中定义了同名的属性时,想要在子类中调用父类中声明的属性,则必须显式的使用“super.”
- 使用“super.属性”的方式,表明调用的是父类中声明的属性
- 当子类重写了父类中的方法之后,想在子类方法中调用父类中被重写的方法时,则必须显式的使用“super.”
- 使用“super.方法”的方式,表明调用的是父类中声明的方法
调用构造器
- 可以在子类的构造器中显式的使用“super(形参列表)”的方式,调用父类中声明的指定的构造器
- “super(形参列表)”的方式使用,必须声明在子类构造器首行
- 在类的构造器中,针对于“this(形参列表)”或“super(形参列表)”只能二者选一,不能同时出现
- 在构造器首行。没有显式的声明“this(形参列表)”或“super(形参列表)”,则默认调用的是父类中空参的构造器:super( )
- 在类的多个构造器中,至少有一个类的构造器中使用了“super(形参列表)”,调用父类中的构造器
子类对象实例化的过程
结果上来看(继承性)
- 子类继承父类以后,就获取了父类声明的属性或方法
- 创建子类的对象,在堆空间中加载所有父类中声明的属性
过程上来看
- 当通过子类的构造器创建子类对象时,一定会直接或间接的调用其父类的构造器,继而调用父类的父类的构造器....直到调用到了java.lang.Object类中 空参的构造器为止
- 正因为加载过所有的父类的结构,所以才可以看到内存中有父类的结构,子类对象才可以考虑进行调用
注意
虽然创建子类对象时调用了父类的构造器,但是至始至终就创建过一个对象,即为new的子类对象
继承性
原文:https://www.cnblogs.com/CrabDumplings/p/13178883.html