目录
2.修饰类:可以染这个类不被其他类继承,此时这个类叫做密封类
二、继承
1.为什么要继承?
我们先写两个类,猫类和狗类,以及Test对他们进行实例化。
我们发现猫类和狗类有很多共性,那我们能否将这些共性进行抽取 ?
于是有了继承的概念,用来进行共性的抽取和代码的复用
2.什么是继承?
继承主要解决的问题就是:共性的抽取,实现代码的复用
我们将猫和狗的共性进行抽取,然后采用共性的思想达到共用
由上图可知,Dog和Cat继承Animal,Animal类称为父类/基类/超类,Dog和Cat称为子类/派生类,继承后,子类可以复用父类中的成员变量或成员方法。
3.如何进行继承?
1.继承格式
修饰符 class 子类 extends 父类{
........
}
继承之后,子类当中会隐含父类中的成员
- 继承后,子类会继承父类中的成员变量和成员方法;
- 如果子类和父类成员变量和成员方法都相同,那将毫无意义;
2.子类访问父类
1.子类访问父类中的成员变量
子类和父类不存在同名成员变量
子类和父类存在同名成员变量
- 如果子类和父类出现相同的成员变量,优先访问子类中的变量
2.子类访问父类中的成员方法
子类和父类成员方法名不同
子类和父类成员方法名相同
1.参数相同 
- 子类和父类的成法名相同时,参数也相同(重写),遵循就近原则,子类优先;
2.参数不同
- 子类和父类成员方法名相同,参数列表不同(重载),根据调用方法传递的参数选择合适的方法访问 ;
但是如果我想在子类和父类成员变量名或成员方法中访问父类,那又应该怎么办?
4.super关键字
super关键字的作用:在子类方法中访问父类成员
super只能指代当前的父类,不能指代父类的父类,甚至继续往上指代
如何使用super关键字?
通过 super. 来访问父类中的成员
在子类成员变量中使用:
在子类成员方法中使用:
super与this
相同点:
- 都是java关键字;
- 可以在成员方法和成员变量中使用;
- 只能在类的非静态中使用;
- 都可以调用构造方法,在调用时,必须是构造方法中的第一条语句
不同点:
- this表示的是当前对象的引用,而super表示子类从父类继承下来部分成员的引用;
- 在非静态成员放方法中,this用来访问当前类的方法和属性,super用来访问从父类继承下来的成员方法和属性;
- 在构造方法中,this()用来调用当前类的构造方法,super()用来调用父类构造方法,两种调用方法不能同时出现在构造方法中;
- 构造方法中一定会存在super()的调用,即使用户没有写编译器也会增加,但是this()不写就没有;
5.子类构造方法
- 在父类中使用构造方法的时候,在子类中也要提供构造方法,否则报错
为什么会出现这样的情况?
父子父子就是先有父再有子,我们要先帮助父类进行初始化。我对父类使用构造方法就是初始化了?我初始化了什么?他初始化的名字,年龄,颜色又是多少?我们都不知道,所以我们要通过子类帮助父类来进行初始化。当子类 继承父类之后,子类需要显示调用父类的构造方法,先帮助父类进行初始化。
- 由上图可以知道,子类中的值会传到父类的构造方法中进行初始化
子类构造方法:
构造方法顺序:
- 由上图可以知道,构造方法的构造顺序是,先构造父类,在构造子类中的构造方法。
注意:
- 如果用户没有写构造方法的时候,编译器会默认提供一个构造方法;如果写了编译器将不会提供构造方法;
- 在子类构造方法中,super()必须是子类构造方法中的第一条语句;
- this()和super()必须都在第一行,所以两者在构造方法中不能同时出现。
代码块执行顺序
- 代码块的执行顺序:
- 先执行父类和子类的静态代码块;
- 在执行父类的实例化代码块和构造方法;
- 最后再执行子类的实例化代码块和构造方法 。
- 静态代码块只执行一次,第二次实例化对象是,子类和父类的静态代码块不会在执行。
6.protect关键字
在封装中我们也有提到四种访问限定符,protected就是其中一种访问限定符,访问限定符就是限定:类或者类中成员能否在类外或者其他包中被访问
而protected的作用就是:同一个包底下的类都可以访问,但是不同包下的只有子类才能使用
7.继承方式
继承方式还有一种多继承,比如猫继承狗的同时继承动物,也就是有两个父类甚至更多,这种继承方式在Java中并不支持,所以会用到接口
在多层继承中一般不超过三层的继承关系
8.final关键字
什么是final关键字?
final关键字:用来修饰变量、成员方法以及类
final关键字的作用有哪些?
1.修饰变量:将变量变成常量,其值不能被修改
2.修饰类:可以染这个类不被其他类继承,此时这个类叫做密封类
3. 修饰方法:表示该方法不能被重写
9.继承与组合
什么是组合?
组合:与继承相似,也是一种表达类之间的关系,也是能够达到代码重用的效果。没有涉及到extends这样的关键字,仅仅是将一个类的实例作为另一个类的字段。
- 继承表示对象之间的关系是is—a,比如猫是动物....
- 组合表示对象之间的关系是has—a, 比如钱包里面有钱,口红....
代码示例:钱包里面有钱、口红
public class Money {
}
public class Paper {
}
public class Wallet {
public Money money=new Money();
public Paper paper=new Paper();
}
继承和组合都可以实现代码复用,根据不同情况进行选择,建议:能使用组合用组合