文章目录
继承
构造方法访问特点
- 父类中的构造方法不会被子类继承
- 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己
为什么
- 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
- 子类初始化前,一定要调用父类构造方法先完成父类数据空间的初始化
如何调用父类构造方法
- 子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行。
- 如果想调用父类有参构造,必须手动写super进行调用。
this、super使用总结
- this:理解为一个变量,表示当前方法调用者的地址;
- super:代表父类存储空间
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
---|---|---|---|
this | this.成员变量 访问本类成员变量 | this.成员方法(...) 访问本类成员方法 | this(...) 访问本类构造方法 |
super | super.成员变量 访问父类成员变量 | super.成员方法(...) 访问父类成员方法 | super(...) 访问父类构造方法 |
多态
多态就是同类的对象,表现出的不同形态。
表现形式
java
父类对象 对象名称 = 子类对象
多态的前提
- 有继承关系
- 有父类引用指向子类对象
- 有方法重写
调用
-
调用成员变量:编译看左边,运行也看左边
-
编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,反之编译失败
-
运行也看左边:java运行代码的时候,实际获取的就是左边父类成员变量的值
-
调用成员方法:编译看左边,运行看右边
-
运行看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,反之编译失败
-
运行看右边:java运行代码的时候,实际上运行的是子类中的方法
多态的优势
-
在多态形式下,右边的对象可以实现解耦合,便于扩展和维护。
javaPerson p = new Student (); p.work();//业务逻辑发生改变时,后续代码无需修改
-
定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
多态的弊端
-
不能使用子类特有功能
-
如果想使用就得强转:
判断a是不是某类型类型:
对象 instanceof 类型
新特性:
a instanceof Dog d----------判断a是否为Dog类型,如果是,则强转为Dog类型,变量名为d,如果不是则不强转,结果是false
包
包就是文件及。用来管理各种不同功能的Java类,方便后期代码维护。
- 包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意。
使用其他类:
java
xxx.xxx.xxx.Student s = new xxx.xxx.xxx.Student();
使用其他类的规则
- 使用同一个包中的类的时候,不需要导包
- 使用java.lang包中的类是,不需要导包
- 其他情况都需要导包
- 如果同时使用两个包中的同类名,需要用全类名
final
方法:表明该方法是最终方法,不能重写
类:表明该类是最终类,不能被继承
变量:叫做常量,只能被赋值一次
常量
实际开发中,常量一般作为系统的信息配置,方便维护,提高可读性。
常量的命名规范:
- 单个单词:全部大写
- 多个单词:全部大写,单词之间用下划线隔开
细节: final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变。
权限修饰符
权限修饰符的分类
有四种作用范围由小到大(private<空着不写<protected<public)
修饰符 | 同一个类中 | 同一个包中其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | √ | |||
空着不写 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
权限修饰符的使用规则
实际开发中,一般只用private和public
- 成员变量私有
- 方法公开
特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有
代码块
- 局部代码块
- 构造代码块
- 静态代码块
静态代码块
格式:static{}
特点:需要通过static关键词修饰,随着类的加载而加载,并且自动触发,只执行一次
抽象方法和抽象类
- 抽象方法:将共性的 行为(方法 )抽取到父类之后,由于每一个子类执行的内容是不一样的,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。
- 抽象类:如果一个类中存存在抽象方法,那么该类就必须声明为抽象类。
定义格式
- 抽象方法:public abstract 返回值类型 方法名(参数列表)
- 抽象类:public abstract class 类名{}
注意事项
-
抽象类不能实例化
-
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
-
可以有构造方法
-
抽象类的子类
-
要么重写抽象类中的所有抽象方法
-
要么是抽象类
-
已经到底啦!!