封装
封装的哲学思维
合理隐藏,合理暴露
封装最初的目的
提高代码的安全性和复用性,组件化。
封装的步骤
- 成员变量应该私有。用private修饰,只能在本类中直接访问。
- 提供成套的getter和setter方法暴露成员变量的取值和赋值
继承
什么是继承
继承是Java中一般到特殊的关系,是一种子类到父类的关系。
例如:学生类继承了人类。 猫类继承了动物类。
被继承的类称为:父类/超类。继承父类的类称为:子类。
继承的特点
单继承:一个类只能继承一个直接父类
为什么Java是单继承的?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17答:反证法,假如Java可以多继承,请看如下代码:
class A{
public void test(){
System.out.println("A");
}
}
class B{
public void test(){
System.out.println("B");
}
}
class C A , B {
public static void main(String[] args){
C c = new C();
c.test(); // 出现了类的二义性!所以Java不能多继承!!
}
}多层继承:一个类可以间接继承多个父类。(家谱)
一个类可以有多个子类
个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类!!
子类继承了一个父类,子类就可以直接得到父类的属性(成员变量)和行为(方法)了
继承的作用
- “可以提高代码的复用”,相同代码可以定义在父类中。然后子类直接继承父类,就可以直接使用父类的这些代码了。(相同代码重复利用)
- 子类更强大:子类不仅得到了父类的功能,它还有自己的功能.
继承的格式
子类 extends 父类{
}
小结
- 继承是子类到到父类的一种关系
- 子类继承了一个父类,子类就可以直接得到父类的属性和行为了。
- 在Java中继承是 “is a” 的关系。Cat extends Animal:猫是一个动物。
- 在Java中,子类是更强大的,子类不仅继承了父类的功能,自己还可以定义自己的功能。
- 继承的优势可以把相同的代码定义在父类中,子类可以直接继承使用
- 这样就可以提高代码的复用性:相同代码只需要在父类中写一次就可以了
子类不能继承父类的内容
引入
- 子类继承父类,子类就得到了父类的属性和行为。
- 但是并非所有父类的属性和行为等子类都可以继承。
子类不能继承父类的东西
子类不能继承父类的构造器:子类有自己的构造器。(没有争议的)
有争议的观点(拓展)
子类是否可以继承父类的私有成员(私有成员变量,私有成员方法)?
– 我认为子类是可以继承父类的私有成员的,只是不能直接访问而已。
– 以后可以暴力去访问继承自父类的私有成员~~~
子类是否可以继承父类的静态成员?
– 我认为子类是不能继承父类的静态成员的
– 子类只是可以访问父类的静态成员,父类的静态成员只有一份可以被子类共享访问。共享并非继承。
继承后-成员变量的访问特点
就近原则
子类有找子类,子类没有找父类,父类没有就报错。
小结
- this代表了当前对象的引用,可以用于访问当前子类对象的成员变量。
- super代表了父类对象的引用,可以用于访问父类中的成员变量。
继承后-成员方法的访问特点
就近原则
子类有找子类,子类没有找父类,父类没有就报错。
小结
子类对象优先使用子类已有的方法。
方法重写
方法重写的概念
- 子类继承了父类,子类就得到了父类的某个方法,但是子类觉得父类的这个方法不好用或者无法满足自己的需求
- 子类重写一个与父类申明一样的方法来覆盖父类的该方法,子类的这个方法就进行了方法重写。
方法重写的校验注解: @Override
Java建议在重写的方法上面加上一个@Override注解。
方法一旦加了这个注解,那就必须是成功重写父类的方法,否则报错!
@Override优势:可读性好,安全,优雅!!
方法重写的具体要求
- 子类重写方法的名称和形参列表必须与父类被重写方法一样。
- 子类重写方法的返回值类型申明要么与父类一样,要么比父类方法返回值类型范围更小。
- 子类重写方法的修饰符权限应该与父类被重写方法的修饰符权限相同或者更大。
- 子类重写方法申明抛出的异常应该与父类被重写方法申明抛出的异常一样或者范围更小!
方法重写的规范
- 加上@Override注解
- 建议“申明不变,重新实现”
小结
- 方法重写是子类重写一个与父类申明一样的方法覆盖父类的方法
- 方法重写建议加上@Override注解
- 方法重写的核心要求:方法名称形参列表必须与被重写方法一致!!
- 建议“申明不变,重新实现”
super调用父类被重写的方法
super:代表了父类引用。
super可以用在子类的实例方法中调用父类被重写的方法
静态方法和私有方法是否可以被重写(拓展语法)
可以吗? 都不可以.
继承后-构造器的特点
子类的全部构造器默认一定会先访问父类的无参数构造器,再执行子类自己的构造器。
为什么子类构造器会先调用父类构造器?
- 子类的构造器的第一行默认有一个super()调用父类的无参数构造器,写不写都存在!
- 子类继承父类,子类就得到了父类的属性和行为, 当我们调用子类构造器初始化子类对象数据的时候,必须先调用父类构造器初始化继承自父类的属性和行为
super调用父类构造器
子类的全部构造器默认一定会调用父类的无参数构造器。
super(…):可以根据参数选择调用父类的某个构造器。
小结
可以在子类构造器中通过super(…)根据参数选择调用父类的构造器,以便调用父类构造器初始化继承自父类的数据
多态
多态的形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
父类类型的范围 > 子类类型范围的。
多态的概念
同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征
多态的识别技巧
- 对于方法的调用:编译看左边,运行看右边
- 对于变量的调用:编译看左边,运行看左边
多态的使用前提
- 必须存在继承或者实现关系
- 必须存在父类类型的变量引用子类类型的对象
- 需要存在方法重写
多态的优劣势
优势:
- 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变,便于扩展和维护。可以实现类与类之间的解耦
- 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法.可以传入一切子类对象进行方法的调用,更能体现出多态的扩展性与便利
劣势:
- 多态形式下,不能直接调用子类特有的功能。编译看左边!! 左边
- 父类中没有子类独有的功能,所以代码在编译阶段就直接报错了!
引用数据类型的自动类型转换
基本数据类型的转换
- 小范围类型的变量或者值可以直接赋值给大范围类型的变量。
- 大范围类型的变量或者值必须强制类型转换给小范围类型的变量
引用数据类型转换的思想(一样)
父类类型的范围 > 子类类型的范围
Animal Cat
语法
- 子类类型的对象或者变量可以自动类型转换赋值给父类类型的变量
引用类型的自动类型转换并不能解决多态的劣势
引用类型强制类型转换
语法
父类类型的变量或者对象必须强制类型转换成子类类型的变量,否则报错!
格式
类型 变量名称 = (类型)(对象或者变量)
注意:有继承/实现关系的两个类型就可以进行强制类型转换,编译阶段一定不报错!但是运行阶段可能出现:类型转换异常 ClassCastException
Java建议在进行强制类型转换之前先判断变量的真实类型,再强制类型转换!
变量 instanceof 类型: 判断前面的变量是否是后面的类型或者其子类类型才会返回true,