继承
父类的抽取
在设计类的时候, 可以根据程序中需要使用到的多个具体的类, 进行共性的提取, 定义为父类。
将多个具体的类中相同的属性和行为提取出来到一个类中。
继承的特点(重点)
产生继承关系后, 子类可以使用父类中的属性和方法, 也可以定义子类独有的属性和方
法
Java是单继承, 一个类有且只能有一个直接的父类,可以有若干个间接的父类,一个父类可以
有0个或者多个子类,子类之间互不影响
使用继承,可以简化代码,提高代码的复用性,提高代码的拓展性,增加代码的健壮性,最重要
的使类与类之间产生了继承的关系,是多态的前提
继承的语法
继承, 需要使用关键字 extends。 在定义类的时候, 使用 子类 extends 父类 的方式描述继承。
Object类:是java继承体系中所有类的父类,Object类没有父类.
不可以被继承
构造方法
构造方法是为了创建当前类的对象的, 不可以继承给子类。
私有成员
私有成员只能在当前的类中使用, 不可以继承给子类。
注意:父类的私有成员,在子类中可见不可用
跨包子类
默认权限的属性、方法, 不可以继承给跨包的子类。
访问权限修饰符
访问权限修饰符, 就是修饰类、属性的访问级别。
对于类来说:只能有default和public两个修饰符
方法的重写
原理
子类可以继承到父类中的属性和方法, 但是有些方法, 子类的实现与父类的方法可能实现的不同。 当父类提供的方法已经不能满足子类的需求时, 子类中可以定义与父类相同的方法。
当出现同名方法后,方法如何调用?
这时子类方法完成对父类方法的覆盖, 又叫重写(Override)。
@Override
一个注解, 进行重写前的校验。 校验这个方法是否是一个重写的方法。 如果不是重写的方 法, 会直接报错。
重写的注意事项
方法名字必须和父类方法名字相同
参数列表必须和父类一致
子类方法的访问权限需要大于等于父类方法的访问权限,父类不能是private
子类方法的返回值类型需要小于等于父类方法的返回值类型–引用类型
super关键字
有时候,子类重写父类方法的时候,并不是要对父类的实现全盘推翻,而是对父类方法进行拓
展。
父类方法中的实现仍然需要, 但是还需要在父类方法的基础上进行拓展的实现, 此时就 需要使用super关键字调用父类的方法。
this和super的对比
this:是一种引用类型,代表当前对象,保存的是当前对象的地址 super:代表的是当前对象的父类,可以调用父类的成员.但是他不是引用数据类型.
继承中使用构造方法
基本使用
子类对象在实例化的时候, 需要先实例化从父类继承到的部分。 此时通过super()默认调
用父类中的无参构造方法。
注意:super()方法是默认的,不需要显示写出来.
当我们创建构造方法的时候,为什么一定要调用super?
原因:父类中也有属性要进行初始化,而对象的属性必须由自己的构造方法进行初始化,所以必须调用super(),所以每个构造方法中都默认有一个super()
如果父类中没有无参构造方法, 对所有的子类对象实例化都会造成影响, 导致子类对象无法实例化!
类中没有无参构造方法的情况:当我们在类中只写了有参构造方法时,系统不会再自动创建无参构造方法.
解决这个问题有两种方案
1.给父类添加无参构造方法。
2.在子类的构造方法中, 使用 super(参数列表) 调用父类中的有参构造方法。
总结:在继承体系中,作为父类最好的办法就是将无参构造方法和有参构造方法都写了.
为什么要将super放在构造方法的第一行?
在子类的构造方法中有可能用到父类的属性,而属性在使用之前必须先进行初始化,否则无法使用.super的作用是初始化父类的属性,如果在super之前调用了其他的代码,有可能造成在未对父类属性初始化时使用了属性的错误情况发生,所以系统默认super前面不能放任何代 码,this()用于构造方法调用时也要放在第一行是一个道理.
final关键字的使用
是一个关键字;最后的最终的,被final修饰的内容是不能再被改变的。
可以修饰的内容
1.类:final修饰的类不能有子类
2.成员变量:变量是一个终值,不能再被改变.所以在定义时必须先手动给一个值.
3.局部变量:被final修饰的局部变量是一个终值,不能再被改变
4.方法:final修饰的方法不允许重写
空白final
描述:修饰成员变量的一种形式
如果是自定义的类可以在定义时先不给值,但是必须在构造方法中给值,即必须保证属性是被初始化了的.这种情况叫空白final.
优点:空白final在final的使用上提供了更大的灵活性,因为一个类中的final域可以做到根据 对象而有所不同,却又保持其恒定不变的特性.
Object类的使⽤
定义
Object类:是java继承体系中所有类的⽗类,Object类没有⽗类.
作为所有类的⽗类,它⾥⾯有11个⽅法,相当于所有⼦类都默认有这些⽅法,所以都很重要.
常⽤⽅法
equals⽅法
使⽤场景:equals⽅法默认⽐较的是对象地址,在实际应⽤中没有太⼤的实际意义,我们经常需要重写equals⽅法,⼤部分系统类,⾃定义的类,都会通过重写equals,再按照⾃⼰制定的规则进⾏⽐较.⽐如:String字符串类,集合类等
hashcode⽅法
使⽤场景:Object的hashcode⽅法默认返回的是对象哈希码值⼗六进制形式,在同⼀个⼯程内部,我们可以认为是唯⼀的,⼤部分情况会重写它,通过重写改变对象哈希值的计算⽅法.⽐如:集合类
getClass⽅法
使⽤场景:获取对象的字节码⽂件对象,每个类都有唯⼀的字节码⽂件对象.使⽤位置⽐如:反射
toString⽅法
使⽤场景:默认打印的是包名+类名+@+⼗六进制的哈希码值,这些内容对我们的作⽤也不⼤.
后期因为默认内容作⽤⼩,打印时直接写引⽤名字,让操作简单,我们会经常重写toString,⽤来展示对象属性的值.
toString⽅法
使⽤场景:默认打印的是包名+类名+@+⼗六进制的哈希码值,这些内容对我们的作⽤也不⼤.
后期因为默认内容作⽤⼩,打印时直接写引⽤名字,让操作简单,我们会经常重写toString,⽤来展示对象属性的值.