文章目录
Java-封装、继承、多态
1 封装
1.1 软件包机制
package:设置的是class文件的保存目录,和源文件没有关系,如果没有设置package语句,则class文件和Java文件在同目录
作用:
-
为了解决命名冲突的问题
-
package语句只能出现在Java源文件的第一行
-
通常采用公司域名倒叙的方式(域名倒叙.项目名.模块名)
-
完整的类名是带有包名的(编译语句: javac -d 生成路径 源文件和运行语句: java.edu.zrz.A)
如何使用其他包中的类:
-
引入当前类中需要的其他类(import 包名.类名)
-
只能在package语句之下,class之上
-
.*是导入某个包下的所有类(java.lang.*下的是核心类,不需要导入可以直接用)
静态导入: 在访问这个类的静态属性的时候,可以直接写名字,不需要加类名前缀
注意: 编码的时候按下空格和回车会自动导包,特别注意不能导错包
1.2 权限控制修饰符
2 继承
2.1 概述
从已有类中派生出新的类,新的类能有已有类的属性和行为,并且能够添加新的属性和行为
目的: 代码重用
注意:
-
Java中只支持单继承,一个类只能有一个父类,但是一个类可以有多个子类
-
private修饰的属性不能继承
-
使用extends关键字表示
-
任何类都有父类,如果没有显示继承,则默认继承Object(Java.lang.Object),Object是Java中提供的根类(祖宗),任何类都直接或者间接继承Object
2.2 语法
[修饰符]class 子类类名 extends 父类类名{}
通过子类就可以直接调用子类和父类的方法
私有化不能被继承
2.3 Super
2.3.1 概述
Super保存了父类型特征,可以理解为是父类对象(Super和this不同,Super没有独立的空间,也不是变量)
2.3.2 作用
-
区分子类和父类同名的变量和方法
-
super(…)只能用在子类构造方法第一行,用来调用父类构造方法(this(…)也是必须在构造方法第一行,所以两个不能同时使用,如果构造方法中两个都没有,则构造方法第一行默认有super()调用父类无参构造)
2.3.3 构造方法私有化
私有化构造方法之后该类不能被继承,因为子类构造方法中需要用到super()去调用父类构造
2.4 方法重写
2.4.1 应用场景
当父类的方法无法满足我们的需求的时候,我们就需要对从父类继承过来的方法进行重写
2.4.2 重写条件
-
必须在有继承关系的体系中
-
方法名与参数列表和返回值要相同
-
不能拥有比原方法更低的访问权限(比如public变为private就不可以)
-
不能比原方法拥有更宽泛的异常
-
方法重写特指成员方法,和静态变量,静态方法,成员变量无关
2.4.3 重写(Override)与重载(Overload)的区别
在此类问题中,面试答题步骤为:
-
分别说出是什么
-
分别说出是干什么的
2.4.4 Override注解
@Override注解是编译时的注解,运行时就没有了,目的是在编译时检查我们的重写方法是否写错
2.5 final
- final修饰的类不能被继承
- final修饰的成员方法不能被重写
- final修饰的变量不能二次赋值,没有默认值,必须显示赋值
(常量: 一般使用public static final修饰 psf,整个程序生命周期不能被更改,常量命名建议全部大写)
3 多态
3.1 概述
父类引用指向子类对象
父类引用:使用父类说明的引用类型变量
指向:通过内存地址可以找到谁
使用父类类型 声明的变量 保存子类对象的使用
父类 变量 = new 子类();
3.2 两种多态形式
编译时多态:
编译时多态是静态的,主要是指方法重载,它是根据不同的参数列表来区分不同的方法
编译之后就会变成不同的方法,在运行时就谈不上多态了
运行时多态:
运行多态是动态的,主要是指动态绑定来实现,指子类实现父类的方法
3.3 相关知识
软件设计六大原则:
- 单一职责原则: 功能职责单一,只拥抱一种变化(只做一件事)
- 里氏替换原则: 所有能使用父类的地方,都可以使用子类(多态就是里氏替换原则的一种体现)
- 依赖倒置原则: 细节依赖抽象
- 接口隔离原则: 最小接口,否则需要实现很多不需要方法
- 迪米特原则(最少朋友原则): 低耦合,高内聚
- 开闭原则: 对修改关闭,对扩展开放