如现实生活中的继承,孩子继承父辈的财产,孩子可以直接拿父辈的财产来使用,Java中的继承是指在现有类的基础上定义一个新的类,现有类称为父类,新的类称为子类,子类会自动拥有父类的可继承的内容
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。多个类可以称为子类,单独那一个类称为父类、超类(superclass)或者基类。
继承描述的是事物之间的所属关系,这种关系是: is-a的关系。
定义
就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。
好处
1.提高代码的复用性。
2.类与类之间产生了关系,是多态的前提。
格式
通过extends关键字,可以声明一个子类继承另外一个父类,定义格式如下:
class 父类 {
...
}
class 子类 extends 父类 {
...
}
例如
// 1.父类
class Person {
String name;
int age;
public void eat() {
System.out.println(name + " 吃饭");
}
public void rest() {
System.out.println(name + " 休息");
}
}
// 2.子类
class Child extends Person {
}
class Adult extends Person {
}
class Worker extends Person {
}
// 3.测试类
public class InheritText {
public static void main(String[] args) {
Child c = new Child();
c.name = "小李";
c.age = 6;
c.eat();
c.rest();
Adult a = new Adult();
a.name = "马上有";
a.age = 28;
a.eat();
a.rest();
Person p = new Person();
p.name = "张三";
p.age = 20;
p.eat();
p.rest();
}
}
父类不可被继承的内容
1.被private修饰的
2.构造方法不能继承
通过getter/setter方法访问父类的private成员变量
继承后的特点:成员变量
成员变量不重名
如果子类父类中出现不重名的成员变量,这时的访问是没有影响的。
成员变量重名
如果子类父类中出现重名的成员变量,这时的访问是有影响的
子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用super关键字,修饰父类成员变量,类似于之前学过的this
格式
super.父类成员变量名
继承后的特点:成员方法
成员方法不重名
如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法
成员方法重名:重写(Override)
如果子类父类中出现重名的成员方法,这时的访问是一种特殊情况,叫做方法重写(Override)。
方法重写:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
示例
class Fu {
public void say() {
System.out.println("Fu shuo");
}
}
class Zi extends Fu {
//子类重写了父类的say方法
public void say() {
System.out.println("Zi shuo");
}
}
public class FzTest {
public static void main(String[] args) {
Zi z = new Zi();
// 子类中有say方法,只执行重写后的say方法
z.say();
}
}
继承后的特点:构造方法
1.构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
2.构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个super(),表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。
继承后子类构造方法特点:子类所有构造方法都会调用父类的无参构造
super和this
super和this的含义
super:代表父类的存储空间标识(可以理解为父亲的引用)。
this:代表当前对象的引用(谁调用就代表谁)。
uper和this的用法
this.成员变量 ‐‐ 本类的
super.成员变量 ‐‐ 父类的
this.成员方法名() ‐‐ 本类的
super.成员方法名() ‐‐ 父类的
this(...) ‐‐ 本类的构造方法
super(...) ‐‐ 父类的构造方法
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。
super()和this()都必须是在构造方法的第一行,所以不能同时出现。
继承的特点
1.Java只支持单继承,不支持多继承。
2.一个类可以有多个子类。
3.Java支持多层继承(继承体系)。
顶层父类是Object类。所有的类默认继承Object,作为父类。
4.子类和父类是一种相对的概念。