面向对象有三大特点:封装,继承和多态,封装在之前已经有所描述,今天我们说一下继承
一、继承
继承的特点:
在Java中,类只支持单一继承(也就是一个儿子只能有一个亲爸爸)
可以多层继承,即一个类的父类可以再去继承另外的父类
继承中要用到一个关键字extends
继承中成员变量的特点:
1.子类只能获取父类非私有成员
子父类中成员变量的名字不一样直接获取父类的成员变量
子父类中成员变量名字是一样的获取的是子类的成员变量
2.就近原则:谁离我近我 就用谁
如果有局部变量就使用局部变量
如果没有局部变量,有子类的成员变量就使用子类的成员变量
如果没有局部变量和子类的成员变量,有父类的成员变量就使用父类的成员变量
3. super:可以获取父类的成员变量和成员方法,用法和this是相似的
public class JiChengTest {
public static void main(String[] args) {
Kid3 k = new Kid3();
k.show();
}
}
class Dad3 {
String name = "父亲";
}
class Kid3 extends Dad3 {
String name = "儿子";
public void show() {
String name = "女儿";
System.out.println(super.name);
System.out.println(this.name);
System.out.println(name);
}
}
继承中成员方法的特点:
1. 子类中没有这个方法,调用父类的
2. 子类中重写了这个方法,调用子类的
方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类重写了父类的方法之后,使用子类对象调用的就是子类的方法
方法的重载:在一个类中,有多个重名的方法,但是其参数不一样(参数的个数,参数的类型,参数的顺序),和返回值无关
class Dad3 {
String name = "父亲";
public void sleep(){
System.out.println("不开空调睡觉");
}
}
class Kid3 extends Dad3 {
String name = "儿子";
@Override
public void sleep(){
System.out.println("开着空调睡觉");
}
继承中构造方法的执行顺序
在子父类中,创建子类对象,调用子类的构造方法,
在子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造
为什么要调用父类构造?因为需要给父类的成员变量初始化,肯定会先把父类的构造执行完毕,在去执行子类构造中的其他代码
super和this的区别
super:子类对象的父类引用
调用父类的成员变量
调用父类的成员方法
在子类的构造方法第一行调用父类的构造方法
this: 当前对象的引用
调用子类的成员变量
调用子类的成员方法
在子类的构造方法第一行调用子类其他构造方法
继承的优缺点
优点:提高了代码的复用性,提高了代码的可维护性
缺点:类的耦合性增强了 开发的原则:高内聚低耦合
二、抽象类
概念:当分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
注意:
有抽象方法的类一定是抽象类
一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类
abstract class Student2{
public abstract void study();
}
/*class Child extends Student2{
public void study(){
System.out.println("好好学习");
}
}
*/
abstract class Child extends Student2{
}
抽象类的特点:
1.抽象方法只能在抽象类里面
2.抽象类和抽象方法必须被abstract修饰
3.抽象类不能创建对象(不能实例化)
4.抽象类中可以有非抽象的方法
5.抽象类和类的关系也是继承
6.一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类
抽象类的成员特点
可以有成员变量,也可以有常量
可以有抽象方法,也可以有非抽象方法
可以有构造方法的,需要对抽象类的成员变量进行初始化