Java的super关键字

步骤 1 : 准备一个显式提供无参构造方法的父类

准备显式提供无参构造方法的父类

在实例化Hero对象的时候,其构造方法会打印

“Hero的构造方法 "

package charactor;

import property.Item;

public class Hero {

    String name; //姓名

    float hp; //血量

    float armor; //护甲

    int moveSpeed; //移动速度

    public void useItem(Item i){
System.out.println("hero use item");
i.effect();
} public Hero(){
System.out.println("Hero的构造方法 ");
} public static void main(String[] args) {
new Hero();
} }

步骤 2 : 实例化子类,父类的构造方法一定会被调用

实例化一个ADHero(), 其构造方法会被调用

其父类的构造方法也会被调用

并且是父类构造方法先调用

子类构造方法会默认调用父类的 无参的构造方法

Java自学-接口与继承 super-LMLPHP

package charactor;

public class ADHero extends Hero implements AD{

    @Override
public void physicAttack() {
System.out.println("进行物理攻击");
} public ADHero(){ System.out.println("AD Hero的构造方法");
} public static void main(String[] args) { new ADHero(); } }

步骤 3 : 父类显式提供两个构造方法

分别是无参的构造方法和带一个参数的构造方法

package charactor;

import property.Item;

public class Hero {

    String name; //姓名

    float hp; //血量

    float armor; //护甲

    int moveSpeed; //移动速度

    public void useItem(Item i){
System.out.println("hero use item");
i.effect();
} public Hero(){
System.out.println("Hero的无参的构造方法 ");
} public Hero(String name){
System.out.println("Hero的有一个参数的构造方法 ");
this.name = name;
} public static void main(String[] args) {
new Hero();
} }

步骤 4 : 子类显式调用父类带参构造方法

使用关键字super 显式调用父类带参的构造方法

package charactor;

public class ADHero extends Hero implements AD{

    @Override
public void physicAttack() {
System.out.println("进行物理攻击");
} public ADHero(String name){
super(name);
System.out.println("AD Hero的构造方法");
} public static void main(String[] args) {
new ADHero("德莱文");
} }

步骤 5 : 调用父类属性

通过super调用父类的moveSpeed属性

ADHero也提供了属性moveSpeed

public int getMoveSpeed(){
return this.moveSpeed;
} public int getMoveSpeed2(){
return super.moveSpeed;
}
package charactor; public class ADHero extends Hero implements AD{ int moveSpeed=400; //移动速度 @Override
public void physicAttack() {
System.out.println("进行物理攻击");
} public int getMoveSpeed(){
return this.moveSpeed;
} public int getMoveSpeed2(){
return super.moveSpeed;
} public static void main(String[] args) {
ADHero h= new ADHero(); System.out.println(h.getMoveSpeed());
System.out.println(h.getMoveSpeed2()); } }

步骤 6 : 调用父类方法

ADHero重写了useItem方法,并且在useItem中通过super调用父类的useItem方法

package charactor;

import property.Item;
import property.LifePotion; public class ADHero extends Hero implements AD { int moveSpeed = 400; // 移动速度 @Override
public void physicAttack() {
System.out.println("进行物理攻击");
} public int getMoveSpeed() {
return this.moveSpeed;
} public int getMoveSpeed2() {
return super.moveSpeed;
} // 重写useItem,并在其中调用父类的userItem方法
public void useItem(Item i) {
System.out.println("adhero use item");
super.useItem(i);
} public static void main(String[] args) {
ADHero h = new ADHero(); LifePotion lp = new LifePotion(); } }

练习super

父类Hero提供了一个有参的构造方法:

public Hero(String name){
this.name = name;
}

但是没有提供无参的构造方法

子类应该怎么处理?

package charactor;

public class Hero {
public String name;
protected float hp; public Hero(String name){
this.name = name;
} // 故意不提供无参的构造方法
// public Hero(){
//
// } public static void main(String[] args) { } }
05-28 18:58