一、什么是继承?
继承是面向对象三大特征之一,可以让类与类之间产生父子的关系。
二、继承的格式
java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。
public class Student extends Person {}
Student称为子类(派生类),Person称为父类(基类或超类)。
三、使用继承的好处
a、可以把多个子类中重复的代码抽取到父类里面,提高了代码的复用性。
b、子类可以在父类的基础上,增加其他的功能,是子类更强大。
四、什么时候使用继承?
当类与类之间,存在形同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码。
例如:有两个类,一个是类是学生,里面有姓名、年龄;另一个类是教师,里面也有名字、年龄,此时,就有必要做一个父类叫person,里面存这两个共同的属性名字、年龄。
五、继承后子类的特点
a、子类可以得到父类的属性和行为,子类可以使用。
b、子类可以在父类的基础上新增其他的功能,使子类更强大。
六、继承的特点
java只支持单继承,不支持多继承,但支持多层继承。
单继承:一个子类只能继承一个父类
不支持多继承:子类不能同时继承多个父类
支持多层继承:子类A继承父类B ,父类B 可以继承父类C
注:每一个类都直接或间接的继承于Object
七、子类可以继承父类中的哪些内容?
构造方法 | 非私有 不能 | private 不能 |
成员变量 | 非私有 能 | private 能 |
成员方法 | 非私有 能 | private 不能 |
八、继承中成员变量、成员方法的访问特点
1.继承中成员变量的访问特点
this调用:就近原则 super调用:直接找父类
public class Fu{
String name = "fu";
}
public class Zi extends Fu{
String name = "zi";
public void Zi1(){
String name = "zi1";
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
结果:
zi1
zi
fu
2.继承中成员方法的访问特点
this调用:就近原则 super调用:直接找父类
class Person{
public void eat (){
System.out.println("吃大米饭");
}
public void drink (){
System.out.println("喝茶π");
}
}
class Stufent extends Person{
public void wufan(){
//先看本类是否有 ,若没有,再看父类
this.eat();
this.drink();
//直接调用父类
super.eat();
super.drink();
}
}
3.什么是方法重写?
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类的这个方法是重写的方法。
4.方法重写建议加上哪个注解,有什么好处?
@Override注解可以校验重写是否正确,同时可读性好。
5.重写方法有哪些基本要求?
a、子类重写的方法尽量跟父类中的方法保持一致。
b、只有虚方法表里面的方法可以被重写。
实例:
class Person{
public void eat (){
System.out.println("吃大米饭");
}
public void drink (){
System.out.println("喝茶π");
}
}
class Liuxueshegn extends Person{
public void wufan(){
this.eat();
this.drink();
}
@Override
public void eat (){
System.out.println("吃意面");
}
@Override
public void drink (){
System.out.println("喝咖啡");
}
}
九、继承中构造方法的访问特点是什么?
a、子类不能继承父类的构造方法,但是可以通过super调用;
b、子类构造方法的第一行,有一个默认的super();
c、默认先访问父类中无参的构造方法,再执行自己;
d、如果想要方法里有父类的有参构造,必须手写书写。
十、this、super使用总结
a、this:理解为一个变量,表示当前方法调用者的地址值
b、super:代表父类存储空间
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
this | this.成员变量 访问本类成员变量 | this.成员方法(...) 访问本类成员方法 | this(...) 访问本类构造方法 |
super | super.成员变量 访问父类成员变量 | super.成员方法(...) 访问父类成员方法 | super(...) 访问父类构造方法 |