Java类立即实例化而无需调用构造函数?

时间:2019-03-01 03:53:35

标签: java

刚开始学习Java。

由于某种原因,如果没有实例化自身的实例,我将无法创建类?

我不能只创建一个类并扩展当前的类吗?如果我尝试调用它的内部函数,它将复制该函数。

我正在尝试了解继承以及如何使我的代码更具模块化

import java.util.InputMismatchException;
import java.util.Scanner;

public class Character extends ClassAttribute {

    public String classType;
    public int health;
    public Object selection;

    public static void main(String[] args) {
        Character chris = new Character();
        System.out.println("your class is: " + chris.classType);
        System.out.println("your health is: " + chris.health);
    };

    public Character() {

        ClassAttribute choice = new ClassAttribute();
        this.classType = choice.classType;
        this.health = choice.health;

    }
}

public class ClassAttribute {

    public String classType;
    public int health;
    public String choice;

    public void human() {
        this.health = 100;
        this.classType = "Human";

    }

    public void ai() {
        this.health = 110;
        this.classType = "Ai";
    }

    public ClassAttribute() {
        System.out.println("Choose a class type (Human || Ai)");
        Scanner readClassChoice = new Scanner(System.in);

        while (!"Ai".equals(this.choice) && !"Human".equals(this.choice)) {
            try {
                this.choice = readClassChoice.nextLine();
            } catch (InputMismatchException e) {
                System.out.println("Please enter a valid class (Ai || Human)");
                readClassChoice.next();
            }
            ;
        }

        if ("Ai".equals(this.choice)) {
            ai();
        } else {
            human();
        }

    }

}

1 个答案:

答案 0 :(得分:0)

执行说明:
我想您对Character和ClassAttribute类中的执行顺序感到困惑。扩展类时必须记住的一件事是,类的构造函数将调用其父类或父类的零参数构造函数,依此类推,直到到达第一个祖先为止。

因此,在代码中,您将在main方法中创建一个Character实例,这将触发Character构造函数,但是在创建ClassAtribute实例之前,Character构造函数将调用ClassAttribute构造函数,因此将执行扫描程序代码。

完成后,它将返回Character构造函数并创建ClassAttribute的实例,该实例将再次执行构造函数,但对于此局部变量实例,因此将再次执行Scanner代码。

因此,您有两个ClassAtribute类,一个是在main上创建的,一个是在Character构造函数上创建的,都执行ClassAtribute构造函数。

由于继承,您不必在构造函数中创建父实例来访问父方法,您只需要使用thissuper关键字即可访问父方法

继承错误的示例 另外,这也不是继承的好样本,因为您学习Java时会发现两个基本关系:组合(有a)和继承(是a)。如果从ClassAtribute扩展Character,则您会说“字符是ClassAtribute”,这似乎很混乱和错误。比较自然的说法是“角色具有健康属性”。

更好的示例 一个更合适的示例是“角色具有属性健康”。然后可以将“人工智能是一个角色”和“一个人是一个角色”翻译为:

class Character {
  String health;
}

class ArtificialIntelligence extends Character { }

class Human  extends Character { }