在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
通过 extends 关键字让类与类之间产生继承关系。
1.继承的书写格式:
在继承的关系中,”子类就是一个父类”。也就是说,子类可以被当做父类看待。例如父类是员工,子类是讲师,那么”讲师就是一个员工”。
定义父类的格式:(一个普通的类定义)
public class 父类名称{
}
定义子类的格式:
public cLass 子类名称 extends 父类名称{
}
例如,在Minecraft中Zombie是继承自EntityMob(生物实体)类的
我们如果要做出一个属于自己的Zombie,就要让它继承自Zombie类:
2.继承访问成员变量的两种方法
在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
- 直接通过子类对象访问成员变量:
如果子类有这个变量,就优先用子类的变量,没有则向上找父类。 - 间接通过成员方法访问成员变量:
该方法属于哪个类,就优先用哪个类,没有则向上找父类的方法。
例如,我们的子类只有MaxHealth(最大生命)和MovementSpeed(移速)这两个属性值,当一个实体被创建时,其最大生命和移速将直接使用子类的属性值。
其父类Zombie类除了有上面的两个属性值,还有FOLLOWRANGE(跟踪范围),ATTACKDAMAGE(攻击力)等属性值,所以当我们子类的实体创建时,其属性值会与父类保持一致。
3.对于局部、本类、父类重名的成员变量的访问
- 局部变量:直接写成员变量名
- 本类的成员变量:this.成员变量名
- 父类的成员变量:super.成员变量名
4.父子类的继承关系中成员方法的访问
在父子类的继承关系当中,创建子类对象,访问成员方法的规则:创建的对象是谁,就优先用谁,如果没有则向上找父类。
这是Zombie中的getEyeHeight(视野高度)的方法,我们自己的Zombie中没有这个方法,当我们的实体在主世界生成时,就会默认使用父类的方法获取其视野高度。
5 重写(Override)
概念:子类可以重写从父类继承的方法,从而允许子类添加或者改变父类中方法的行为。在继承关系当中,方法的名称一样,参数列表也一样。
重写 与 重载的区别
重写(Override):方法的名称一样,参数列表【也一样】。也称覆盖、覆写。
重载(Overload):方法的名称一样,参数列表【不一样】。
方法的覆盖重写特点:创建的是子类对象,则优先用子类方法。
方法覆盖重写注意事项
1.必须保证父子类之间方法的名称相同,参数列表也相同。
@Override:写在方法前面,用来检测是不是有效的正确覆盖重写。
这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。
2.子类方法的返回值必须【小于等于】父类方法的返回值范围。
Note: java.Lang.Object类是所有类的公共最高父类(祖宗类),java.Lang.String就是Object的子类;。
3.子类方法的权限必须【大于等于】父类方法的权限修饰符。
Note: public > protected > (default) > private
备注:(default)不是关键字default,而是什么都不写,留空。
4种对应写法:
public int num;
protected int num;
int num;
private int num;
在mod中我如果想要让Ehan可以具有回血的效果,就要重写onLivingUpdate()方法。
这个方法是对其父类铁傀儡的onLivingUpdate()方法进行了覆盖重写,这样我们的实体就具有了新的能力。
6.super关键字
super的用法有三种:
- 在子类的成员方法中,访问父类的成员变量。
2.在子类的成员方法中,访问父类的成员方法。
3.在子类的构造方法中,访问父类的构造方法。
我们的实体在世界生成时,都是使用的父类的构造方法super(worldIn)。
7.this关键字
super关键字用来访问父类内容,而this关键字用来访问本类内容。
this用法有三种:
- 在本类的成员方法中,访问本类的成员变量。
2.在本类的成员方法中,访问本类的另一个成员方法。
3.在本类的构造方法中,访问本类的另一个构造方法。
第三种用法当中要注意:
A. this( …)调用也必须是构造方法的第一个语句,唯一一个。
B. super和this两种构造调用,不能同时使用。