JavaSE进阶
今日内容:继承,修饰符:权限修饰符、静态修饰符static、最终修饰符final
继承
概述:继承是面向对象的三大特征(封装,继承和多态)之一
Java中的继承描述的是子父类的关系,子类可以拥有父类中可继承的成员,同时子类也可以有自己特有的成员
注:1、构造方法不能被继承 2、私有成员不能被继承
格式:
public class 子类 extends 父类{
}
注:1、父类一定要先定义好,在定义子类的同时使用继承的格式
2、子类:也可以称为派生类
3、父类:也可以称为基类或者超类
继承的使用场景
继承的由来:多个类有共性的成员,可以将共性的内容不断向上抽取,抽取到另一个类中,其他的类就继承这个类。抽取出来的这个类就是父类,从而简化了代码
继承的好处和弊端
好处:1、可以提高代码的复用性 2、可以提高代码的扩展性 3、是多态的前提之一
弊端:让类与类之间的关系变得紧密(耦合性增强),让子类不再是独立的个体,有了一些约束。
注:1、Java中的类只支持单继承,不支持多继承
2、Java中的类支持多层继承
3、一个类可以被多个类同时继承
4、子类和父类是相对的概念
5、不能乱用Java中的继承,Java中的继承描述的是“is a” 的关系
…is a…:表示…是…的一种
继承中成员的特点
成员变量:(就近原则:离谁近就用谁)运行一个类文件中编写多个类,但是要求最多只有一个是public修饰的类,并且public修饰的类与类文件名要相同,学习阶段为了避免多个类来回切换,可能经常使用这种方式,但是开发环境中都建议每一个类都在独立的类文件中定义
构造方法:一定会先执行父类的构造方法,然后再执行子类的构造方法
默认调用父类的空参构造方法,super();在本类中this调用不能形成闭环;
为什么要保证父类的构造方法先执行:保证父类中的成员进行初始化,子类可能会使用到父类的成员变量
调用构造方法的方式:1、使用new关键字调用 2、使用this()或者super()
成员方法:类似于就近原则;首先找本类的成员方法,如果没有,则找父类的成员方法,如果都有,找本类的成员方法,如果都没有,则报错。
this和super
this:表示当前类的对象(的引用),在一个方法中的this,谁来调用this就表示谁
作用:1、调用本类的成员变量 this.成员变量名
区分成员变量和局部变量:只能是成员变量可以使用this进行调用
2、调用本类的成员方法 this.成员方法()
3、调用本类的构造方法 this(参数)
super:表示当前类的父类的那片空间(没有地址值)
作用:1、调用父类的成员变量 super.成员变量名
2、调用父类的成员方法 super.成员方法()
3、调用父类的构造方法 super(参数)
注:1、this()和super()这样的语句只能使用在构造方法中;2、必须位于构造方法的第一行有效代码;3、this()和super()这样的语句不呢同时出现
方法重写Override
概念:方法重写也称为方法复写/方法覆盖
在有子父类关系的两个类中,子类出现了和父类的方法相同的方法,这种现象就是方法重写
Java提供了一个@Override注解可以验证一个方法是否重写的方法
为什么要进行方法重写(方法重写的使用场景):发生方法重写我们一般不会修改方法声明,而是修改方法体内容;如果父类的无法满足子类的需求,则会进行方法重写:1、完全不满足:完全修改方法体内容,和父类方法体内容完全不同
2、不完全满足 :满足的部分会调用父类被重写的方法,不满足的部分再单独修改
3、完全满足(不进行重写,继承下来即可)
1、2两种情况会进行方法重写
方法重写的原则:发生方法重写,一般不会进行修改,而是修改方法体内容,但是要修改方法声明也可;
遵循以下原则:一大两同两小
一大:子类重写方法的权限修饰符要大于等于父类的权限修饰符
权限修饰符:public>protected>默认>private;
如果父类的方法是private权限,私有不能被继承,更不能被重写
两同:方法名必须相同,参数列表必须相同
两小:子类重写方法的返回值类型必须小于等于父类方の法的返回值类型(针对引用类型有效,针对基本类型无效)
子类重写方法的异常必须小于等于|少于等于父类方法所抛的异常,父类方法如果没有抛异常,则子类重写的方法一定不能抛异常
面试题:方法重载(Overload)和方法重写(Override)的区别
方法重载:1、同一个类种,出现了方法名相同,参数列表不同的方法的现象
2、只和方法名和参数列表有关,和其他无关
方法重写:1、有子父类关系的两个类中,子类出现了和父类中方法名相同、参数列表也相同的方法
2、除了和方法名和参数列表有关之外,和其他(权限修饰符、返回值等)有关
修饰符
权限修饰符
是用于控制所修饰内容(类,成员变量、成员方法和构造方法)的访问权限(使用范围)的修饰符
使用范围最小为本类中。
权限修饰符四种:
权限范围从大到小依次为:public protected (默认)default private
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pcnc8YRX-1659680170740)(C:\Users\32237\AppData\Roaming\Typora\typora-user-images\image-20220804161402653.png)]
在不同包的子类对象下,protected只能在子类中创建对象进行调用,不能创建父类对象进行调用。
注:类使用的权限修饰符会影响类中成员的访问权限
最终修饰符final
final关键字,可以修饰类、成员方法和变量
修饰类的特点:该类不能被继承(太监类)
JDK中也提供了一些final修饰类:String、System
修饰的成员方法的特点:该方法不能被重写,但是可以被继承
修饰的变量的特点:修饰的变量变成了常量,不能再次赋值。
类中那些不能被继承:构造方法,private修饰的成员方法
类中那些不能被重写:构造方法,private修饰的成员方法;不能被继承,肯定不能被重写;能被继承,也不一定能被重写。如果是static修饰的方法,也不能被重写
final可以是修饰成员变量,也可以修饰局部变量;修饰完就都变成了常量
常量的命名规范:所有的单词都是英文大写,如果有多个单词组成,则中间使用下划线(_)分隔
可以使用快捷键:大小写之间的切换:ctrl+shift+u;
final修饰的变量既可以是基本类型,也可以是引用类型
如果修饰的是基本类型,表示值不能修改,不能被重新赋值
如果修饰的是引用类型,表示值不能重新赋值;地址值不能被修改,内容可以修改
final修饰成员变量:
1、一般还会和另外两个修饰符一起使用
public static final int NUM=10;
2、赋值时机问题:可以显示赋值;在构造方法运行之前赋值就行
静态修饰符static
static关键字就是静态修饰符,可以修饰成员变量、成员方法和静态代码块
静态修饰的特点:
1、修饰后属于类,不再属于某一个对象,而是该类的所有对象所共享
2、多了一种调用方法,可以通过类名.进行调用,主要用这种方式
3、静态只能调用静态,不能直接调用非静态;
非静态可以调用非静态,也可以调用静态;
静态的内容随着类的加载而存在的,出现时机比较早
非静态的内容加载都是比较晚的
static的使用场景
一般我们不适应static修饰成员变量和成员方法,只有满足以下条件才使用:
static修饰成员变量:1、如果一些成员变量的值对于所有的对象来说是相同的(共享的),那么可以使用static修饰;2、如果希望在静态的内容中,直接使用成员变量,也可以使用static进行修饰。
static修饰成员方法:1、如果是工具类中的方法,都可以使用static进行修饰,可以方便调用。2、如果希望在静态的内容中直接使用成员方法,也可以使用static进行修饰。
类根据作用不同,名称不同,内部的规范不同:
1、测试类:有main方法的类,可以独立运行的;
2、标准类:描述类/javabean类,用于描述现实世界事物的;
3、工具类:工具箱,里面有一些方便和好用的工具方法,用于简化操作。
main方法
public static void main (String[] args){}
public:权限修饰符,使用的是最大权限
static:静态的,随着类的加载而加载,出现的比较早
void:该方法没有返回值
main:方法的名称,固定的名称
(String[] args):参数列表,一个String类型数组,args是参数的名称
工具类
特点:1、构造方法使用private修饰,2、所有的成员方法都是static修饰的
jar包
后缀名为.jar的文件,JAR文件(Java归档)是一种软件包文件格式
:权限修饰符,使用的是最大权限
static:静态的,随着类的加载而加载,出现的比较早
void:该方法没有返回值
main:方法的名称,固定的名称
(String[] args):参数列表,一个String类型数组,args是参数的名称
工具类
特点:1、构造方法使用private修饰,2、所有的成员方法都是static修饰的
jar包
后缀名为.jar的文件,JAR文件(Java归档)是一种软件包文件格式