大一菜鸟,正在自学java中,文章如有误的地方,欢迎交流指正,共同进步!🐵🐵🐵
一.继承的概述
1.继承是面向对象的三大特征之一,可以使子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
2. 继承格式:
public class 子类名 extends 父类名{}
3.父类和子类的关系:
- 父类: 就是被继承类, 别称: 超类, 基类
- 子类: 就是用于继承的类. 别称:派生类
4.好处: - 提高了代码的复用性
- 提高了代码的可维护性
- 是类中多态实现前提
5.弊端: - 提高了代码与代码之间耦合性,当父类发生变化的时候,子类会跟着变化,削弱了子类的独立性
- 开发的原则: 面向对象最终的目标要实现: 高内聚低耦合
高内聚:一个事物自己可以完成所有的功能, 低耦合:对于其他代码的依赖性非常低
自动生成继承模式图:在子类中鼠标右键找到Diagrams键可以生成
二.继承中访问特点
##1.继承中变量访问特点
- 在子类中访问一个变量:
- 子类局部范围中找
- 子类成员范围找
- 父类成员范围找
- 如果没有就会报错
- 即遵循就近原则
- 代码示例:
public class parent02 {
int age=20;
}
public class student02 extends parent02 {
int height = 118;
int age= 21;
public void show(){
/*int age=22;
int height = 168;*/
System.out.println( age +","+height);
}
}
//测试类
public class Demo02 {
public static void main(String[] args) {
student02 s= new student02();
s.show();
}
}
- super关键字:super关键字用法和this关键字用法相似
- this关键字表示当前类对象的引用
super关键字表示当前类对象的父类的引用 - this和super表格图:
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
---|---|---|---|
this | this.成员变量(访问本类的成员变量) | this(…)(访问本类的构造方法) | this.成员方法(访问本类的成员方法) |
super | super.成员变量(访问父类的成员变量) | super(…)(访问父类的构造方法) | super.成员方法(访问父类的成员方法) |
- 代码案例:
public class parent03 {
int age = 20;
}
public class student03 extends parent03 {
int age = 21;
public void show() {
int age = 22;
System.out.println(age);
//访问成员变量
System.out.println(this.age);
//访问父类中的成员变量
System.out.println(super.age);
}
}
public class Demo03 {
public static void main(String[] args) {
student03 s=new student03();
s.show();
}
}
2.继承中构造方法的访问特点
- 在初始化子类数据之前,必须先完成对父类数据的初始化(因在初始化子类的时候,可能会用到父类的数据, 则必须先把父类的内容初始化完成)
- 如果在子类构造方法,没有显示的调用任何其他的构造方法, 在构造的第一句,系统会默认给你加上一句代码: super(); 默认访问父类空参的构造方法
- 如果子类在自己的构造方法,手动的加上父类构造方法的调用, 那么系统就不会给你添加任何构造方法的调用
- 自己可以调用自己的构造方法,访问自己的其他构造方法;此时也不会添加super()
- 构造方法不能自己调用
- 构造方法的调用,也不能写成循环调用
- 在一个构造方法中, this语句和super语句只能出现在这个构造方法的第一句
- 在一个构造方法中,this语句和super语句两者只能出现一个
子类在调用自己构造方法时,默认调用父类的构造方法
子类中如果访问其他构造方法, 必须把它this语句和super语句写在第一句
子类的构造方法中,this语句和super语句两者只能出现一个
- 案例:
public class parent04 {
public parent04(){
System.out.println("父类带无参构造方法");
}
public parent04(int age){
System.out.println("父类带有参构造方法");
}
}
public class student04 extends parent04 {
public student04(){
super(20);
System.out.println("子类带无参构造方法");
}
public student04(int age){
super(20);
System.out.println("子类带有参构造方法");
}
}
public class Demo04 {
public static void main(String[] args) {
student04 s=new student04();
student04 s2=new student04(20);
}
}
3.继承中成员方法的访问特点
- 通过子类对象访问一个方法:
- 子类成员范围找
- 父类成员范围找
- 如果找不到就报错
- 代码案例:
public class parent05 {
public void show(){
System.out.println("父中show方法被调用");
}
}
public class student05 extends parent05 {
public void method(){
System.out.println("子中method方法别调用");
}
public void show(){
super.show();
System.out.println("子中show方法被调用");
}
}
public class Demo05 {
public static void main(String[] args) {
//创建对象 调用方法
student05 s=new student05();
s.method();
s.show();
}
}
- super内存图:
三.方法重写
- 在父子类中,出现了一模一样的方法,但两个方法内部实现不一样
- 当子类需要父类的功能时,而功能主体中,子类有自己独特的内容,通过重写,就延续了父类的功能,又定义了自己特有内容
重载: 在同一个类中,方法名一致,参数列表不同,与返回值类型无关
重写: 在父子类中,方法名一致, 参数列表一致,返回值类型一致
- @Override(一个注解)检查重写方法声明的正确性
- 案例:
public class Parent06 {
public void show() {
System.out.println("父类中show方法");
}
public void method() {
System.out.println("父类中method方法");
}
}
public class Student06 extends Parent06 {
@Override
public void show() {
System.out.println("子类中的show方法");
}
@Override
public void method() {
System.out.println("子类中的method方法");
}
}
方法重写的注意事项:
重写方法必须是父类定义的方法
重写方法可以保存父类的实现,保存的方式super.重写的方法名(实参),也可以不要父类的实现
重写的方法,子类方法访问权限不能比父类小(public>默认>private(私有的))
父类的方法如果用private修饰, 子类是无法重写(即私有方法不能被重写)
5.继承的特点:
- java中支持单继承,不支持多继承,但java支持多层继承,继承传递性
- 单继承: 一个子类只能由一个父类
- 多继承: 一个子类可以同时继承多个父类
- 多层继承: A类继承B类, B类继承自C类, 那么A类中就拥有B类和C类所有可以继承过来的属性和方法
如果支持了多继承, 那么可能子类继承的多个父类中有相同的方法,
父类们对这些方法都有不同实现,子类继承中就不知道该调用那个父类对这个方法的实现了则存在安全隐患