继承(java语法)
在我们敲代码的过程中会遇到大量代码重复、冗余等问题,由此我们想到能否将这些重复的代码进行抽取呢?
因此在面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。
1.继承的概念
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性
的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了
由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
2.继承的语法
在Java中如果要表示类之间的继承关系,需要借助extends关键字, 具体如下:
修饰类 class 子类 extends 父类{
......;
}
- 子类会将父类中的成员变量或者成员方法继承到子类中了
- 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了
3.父类成员访问
在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类中继承下来的成员呢?
3.1.1 子类中访问父类的成员变量
在子类方法中 或者 通过子类对象访问成员时:
- 如果访问的成员变量子类中有,优先访问自己的成员变量。
- 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
- 如果访问的成员变量与父类中成员变量同名,则优先访问自己的 。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
3.1.2 子类中访问父类的成员方法
-
通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到
则访问,否则编译报错。
-
通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用
方法适传递的参数选择合适的方法访问,如果没有则报错 。
问题:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢? 请看下文。
4. super关键字
super关键字主要作用:在子类方法中访问父类的成员。
-
只能在非静态方法中使用
-
在子类方法中,访问父类的成员变量和方法。
public class 子类 extends 父类{ super.a; //访问父类成员变量 super(); //访问父类成员方法 }
5.子类构造方法
父子父子,先有父再有子,即:子类对象构造时,需要先调用父类的构造方法,然后再执行子类的构造方法。
class father{
public father(){ //父类构造方法
...
}
}
class son extends father{
public son(){ //用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句.
super(); //在子类完成构造之前,必须先完成父类的构造方法,因此才会用super()调用父类方法
} //如果有参数,即传递参数。
}
将从父类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。
- 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构
造方法
- 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的
父类构造方法调用,否则编译失败。
- 在子类构造方法中,super(…)调用父类构造时,必须是子类构造函数中第一条语句。
- super(…)只能在子类构造方法中出现一次,并且不能和this同时出现
6. super和this的区别
【相同点】
-
都是Java中的关键字
-
只能在类的非静态方法中使用,用来访问非静态成员方法和字段
-
在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】
- this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
- 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
- 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现
- 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有
7. protected 、public 、private 、default 关键字访问权限
default:代表没有关键词修饰的成员变量
NO | 范围 | private | default | protected | public |
---|---|---|---|---|---|
1 | 同一包中的同一类 | 🉑 | 🉑 | 🉑 | 🉑 |
2 | 同一包中的不同类 | 🉑 | 🉑 | 🉑 | |
3 | 不同包中的子类 | 🉑 | 🉑 | ||
4 | 不同包中的非子类 | 🉑 |
8. final关键字
final关键可以用来修饰变量、成员方法以及类。
-
修饰变量或字段,表示常量**(即不能修改)**
final int a = 10; a = 20; // 编译出错
-
修饰类:表示此类不能被继承
final public class Animal { ... } public class Bird extends Animal { ... } // 编译出错 Error:(3, 27) java: 无法从最终com.bit.Animal进行继