内容纲要
继承就是子类(扩展类、派生类)继承父类(超类、基类)的属性和行为,父类可以把子类中共性的代码抽取出来。子类继承父类的字段和方法,子类可以直接访问父类的非私有private变量和方法。
继承
Java是单继承语言,可以多级继承,可以通过实现接口弥补。
定义
使用
extends
关键字来定义类的继承,子类也可以自定义自己特有属性与行为,其中java.lang.Object
是所有类的超类。
Pet.java
public class Pet {
String name;
int age;
public void eat() {
System.out.println("我在吃饭!");
}
}
Cat.java
public class Cat extends Pet {
String name;//与父类同名成员变量
String food;
public void play(){
System.out.println("我在玩");
}
}
成员变量
- 父类只能使用本类中,而子类可以使用父类的非私有变量方法。
- 若子类对象中使用父类的成员变量,则会向上寻找。
- 若子类变量与父类变量重名,通过方法间接访问变量,方法属于谁就使用谁的变量。
- 若子类使用和父类成员变量重名,实例化谁的对象就优先使用谁的变量。
- 如果父类子类变量重名,可以通过
this
、super
关键字区分父类子类变量。
成员方法
- 若子类使用和父类成员方法重名,实例化谁的对象就优先使用谁的变量。
- 如果父类子类方法重名,可以通过
this
、super
关键字区分父类子类方法。
方法重写
在继承中,父类子类方法的名称一样,参数列表一样称为子类重写父类方法。
Pet.java
public class Pet {
public void eat() {
System.out.println("我在吃饭!");
}
public Object play(){
return null;
}
}
Cat.java
public class Cat extends Pet {
@Override
public void eat(){
System.out.println("我在玩");
}
//返回值类型必须小于父类的返回值类型,String的父类是Object
@Override
public String play(){
return null;
}
}
- 可以通过添加注解
@Override
来检测是否重写。 - 子类方法中的返回值类型必须不能大于父类的返回值类型
- 子类方法权限必须大于等于父类方法的权限修饰符:
public > protected > [default](默认什么都不写) > private
。
构造方法
子类不可继承父类的构造方法
public class Pet {
public Pet() {
System.out.println("Pet构造方法");
}
}
Cat.java
public class Cat extends Pet {
public Cat() {
super();//默认调用父类构造方法
System.out.println("Cat构造方法");
}
}
- 在创建具有继承关系的子类事例时,默认调用父类构造方法,先执行父类构造方法后执行子类构造方法。
super
关键字
- 在子类成员方法中,访问父类的成员变量
super.变量名
。 - 在子类成员方法中,访问父类的成员方法
super.方法名(参数列表);
。 - 在子类构造方法中,访问父类的构造方法
super(参数列表);
,只能写在语句第一行,并且只能调用一次,不能与this(参数列表);
同时调用。
this
关键字
- 在本类成员方法中,访问本类的成员变量
this.变量名
,用来区分本类变量和局部变量,父类变量重名。 - 在本类成员方法中,访问本类的成员方法
this.方法名(参数列表);
。 - 在本类构造方法中,访问本类的另一个构造方法
this(参数列表);
,只能写在语句第一行,并且只能调用一次,不能与super(参数列表);
同时调用。
抽象类
在方法的前面加上关键字
abstract
,去掉语句块就是抽象方法。抽象方法所在的类必须是抽象类,在
class
之前加上abstract
,在抽象类中可以定义普通方法。
定义
不能实例化抽象类,比须用一个子类继承抽象类,子类必须重写抽象父类中的方法。
AbstractPet.java
public abstract class AbstractPet {
public abstract void speak();
public void instroduce(){
System.out.println("我是宠物!");
}
}
Cat.java
public class Cat extends AbstractPet{
@Override
public void speak() {
System.out.println("喵喵喵!");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.speak();
//喵喵喵!
}
}
- 抽象类中可以有构造方法,可以通过子类
super(参数列表);
调用。 - 有抽象方法的一定是抽象类,抽象类不一定有抽象方法。
留言