为什么我的代码在java中输出[email protected]?

问题描述:

按照惯例我想说明我是一个起步者,如果我不使用正确的术语,请提前抱歉。为什么我的代码在java中输出[email protected]?

我做了什么:

我创建的输出从主一个单独的类配方的方法。在主类中,我创建了一个对象来调用另一个类的方法。

从主:

Breakfast recipeName2 = new Breakfast(); 
recipeName2.frenchToast(); 
System.out.println(recipeName2); 

从其他类:

public void frenchToast(){ 

     System.out.println("\n"); 
     StringBuilder sba = new StringBuilder("For French toast you will need:\n "); 

     sba.append("Eggs\n "); 
     sba.append("Bread\n "); 
     sba.append("Cinnamon\n "); 
     sba.append("Vanilla "); 

     System.out.println(sba.toString()); 

    } 

} 

问题:

以为配方正确输出,由于某种原因,在它的尽头,这是也加入:成分[email protected]

我不确定它是什么或如何摆脱它。我尝试以不同的方式改变我的代码,例如改变我在参数system.out.ln()中放入的内容,但是这样会混淆我的代码。我有一种预感,这是因为某些东西正在通过别的东西传递的方式,但我试图改变我编写代码的方式,无济于事。

如果有人能帮助我,我将非常感激。自从我的代码在技术上起作用后,我会继续执行我的项目,但是我被这个难住了,并且很想知道为什么会发生这种情况。

感谢

+0

执行'System.out.println(recipeName2);'时,你会发生什么?为什么? –

+0

只需删除一行“System.out.println(recipeName2);” 它输出对象参考“[email protected]” – keil

你的错误是因为该行System.out.println(recipeName2);下面我已经展示了如何在frenchToast()frenchToast2()分别同时使用无效或字符串:

class Main { 
    public static void main(String[] args) { 
    Breakfast recipes = new Breakfast(); 
    recipes.frenchToast(); 
    System.out.println(recipes.frenchToast2()); 
    } 
} 

class Breakfast { 
    public void frenchToast(){ 
    StringBuilder sba = new StringBuilder("For French toast you will need:\n "); 
    sba.append("Eggs\n "); 
    sba.append("Bread\n "); 
    sba.append("Cinnamon\n "); 
    sba.append("Vanilla "); 
    System.out.println(sba.toString()); 
    } 

    public static String frenchToast2(){ 
    StringBuilder sba = new StringBuilder("For French toast you will need:\n "); 
    sba.append("Eggs\n "); 
    sba.append("Bread\n "); 
    sba.append("Cinnamon\n "); 
    sba.append("Vanilla "); 
    return(sba.toString()); 
    } 
} 

等效输出:

For French toast you will need: 
Eggs 
Bread 
Cinnamon 
Vanilla 
For French toast you will need: 
Eggs 
Bread 
Cinnamon 
Vanilla 

试试吧here!

你的早餐类不会覆盖toString()方法。因此,当您打印早餐对象时,它将使用Object::toString方法,该方法将打印'在Java堆中位置标识符'。

回顾一下你的对象模型会更好一些,但是对于你来说简单的修复就是使FrenchToast成为一个延长早餐的类(或者如果你使早餐成为一个接口就实现),然后把字符串放到toString方法。

像这样:

public interface Breakfast {} 

public class FrenchToast implements Breakfast { 

    @Override 
    public String toString() { 
     StringBuilder sba = new StringBuilder("For French toast you will need:\n "); 
     sba.append("Eggs\n "); 
     sba.append("Bread\n "); 
     sba.append("Cinnamon\n "); 
     sba.append("Vanilla "); 

     return sba.toString(); 
    } 
}