刚开始学习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();
}
}
}
答案 0 :(得分:0)
执行说明:
我想您对Character和ClassAttribute类中的执行顺序感到困惑。扩展类时必须记住的一件事是,类的构造函数将调用其父类或父类的零参数构造函数,依此类推,直到到达第一个祖先为止。
因此,在代码中,您将在main方法中创建一个Character实例,这将触发Character构造函数,但是在创建ClassAtribute实例之前,Character构造函数将调用ClassAttribute构造函数,因此将执行扫描程序代码。
完成后,它将返回Character构造函数并创建ClassAttribute的实例,该实例将再次执行构造函数,但对于此局部变量实例,因此将再次执行Scanner代码。
因此,您有两个ClassAtribute类,一个是在main上创建的,一个是在Character构造函数上创建的,都执行ClassAtribute构造函数。
由于继承,您不必在构造函数中创建父实例来访问父方法,您只需要使用this
或super
关键字即可访问父方法
继承错误的示例 另外,这也不是继承的好样本,因为您学习Java时会发现两个基本关系:组合(有a)和继承(是a)。如果从ClassAtribute扩展Character,则您会说“字符是ClassAtribute”,这似乎很混乱和错误。比较自然的说法是“角色具有健康属性”。
更好的示例 一个更合适的示例是“角色具有属性健康”。然后可以将“人工智能是一个角色”和“一个人是一个角色”翻译为:
class Character {
String health;
}
class ArtificialIntelligence extends Character { }
class Human extends Character { }