-1

请不要陷入拼写错误。我不明白为什么教授的 saluer 函数正在使用屏幕输出中的教授参数。

代码输出:
Mes hommages pour ma / mon collègue Neumann!


我的 Person 类。

class Personne {
    String nom;


    Personne() {
        this("Anonymus");
    }

    Personne(String nom) {
        this.nom = nom;
    }

    String saluer(Personne p) {
        return this.nom + " salue " + p.nom + " !";
    }

    public String toString() {
        return "La personne " + nom + ".";
    }
}

我的另一堂课(教授)

class Prof extends Personne {
    String nomCours = "Java";

    Prof() {
    }

    Prof(String arg) {
        this("NoName", arg);
    }

    Prof(String arg1, String arg2) {
        super(arg1);
        this.nomCours = arg2;
    }

    String saluer(Prof p) {
        return "Mes hommages pour ma/mon collègue " + p.nom + " !";
    }

    String saluer(Personne p) {
        return "La/le prof " + this.nom + " présente ses hommages à " + p.nom + " !";
    }

    String saluer(Etudiant e) {
        if (this.nomCours.equals(e.nomCours))
            return "Bonjour à mon étudiant(e) " + e.nom + " !";
        return "Bonjour de la part de " + this.nom + " !";
    }

    public String toString() {
        return "Le prof " + nom + " donne le cours " + nomCours + ".";
    }
}

我的主要课程

public static void main(String[] args) {
    Personne mixte1 = new Prof("Poincaré", "Math");
    Personne mixte2 = new Prof("Neumann", "Info");
    Personne mixte3 = new Etudiant("Toi", "Info");

    System.out.println(mixte1.saluer(((Prof)mixte2)));  // problem here

}
4

2 回答 2

1

您的saluer()方法接受一个Personne对象,并且您的Prof对象正在扩展Personne,因此这意味着您(或在本例中为编译器)可以Prof转换为Personne没有任何错误,因为它们基于同一个类。

您总是可以在继承树中向上转换

Personne
  |
  +-- Prof
  |
  +-- Etudiant

也可以将 an 投射Etudiant到 Personne。或者,您可以将 Etudiant 转换为 a Personne,然后再转换为 a Etudiant,这也可以。但是您不能将 an 强制Etudiant转换为 a Prof,因为它们在继承树中处于同一级别。

于 2019-01-30T07:23:03.333 回答
0

问题是,该类Personne没有saluer将另一个Personne作为参数的方法。您的类Prof可以,但是在代码中的那一行,编译器不知道这一点。你可以(例如)写:

public static void main(String[] args) {
    Personne mixte1 = new Prof("Poincaré", "Math");
    Personne mixte2 = new Prof("Neumann", "Info");
    Personne mixte3 = new Etudiant("Toi", "Info");

    System.out.println(((Prof)mixte1).saluer(mixte2);  // problem here

}

回答一般问题:Java 编译器尽可能地了解您正在调用哪个对象的方法。当您尝试调用mixte1.saluer((Prof) mixte2)时,您错误地认为编译器知道该方法saluer(Prof prof)与 mixte1 一起存在,但是您“向下转换”mixte1为 a Personne,因此编译器不知道这一点。

于 2019-01-30T07:25:12.883 回答