这个Java代码中有错误吗?

这个Java代码中有错误吗?,java,Java,这个代码有错误吗 “其他出生年份”错了吗?我的老师说这是错误的,但对我来说效果很好。你必须让老师解释为什么他们认为这是错误的(这可能是一个风格问题,甚至是一个误解),这样你才能从中学习 最终这个人会影响你的成绩。这是与他们进行积极互动的绝佳机会。你的老师越是亲自教你,你掌握学科的机会就越大 另一方面,如果当你被告知有问题时,你会私下去问一般的互联网社区,你有可能被告知你是对的,你最终会产生一种比你的老师更优越的错误感觉,这将适得其反。这是错误的,因为你正在访问一个私人会员(您声明了另一个对象的p

这个代码有错误吗


“其他出生年份”错了吗?我的老师说这是错误的,但对我来说效果很好。

你必须让老师解释为什么他们认为这是错误的(这可能是一个风格问题,甚至是一个误解),这样你才能从中学习

最终这个人会影响你的成绩。这是与他们进行积极互动的绝佳机会。你的老师越是亲自教你,你掌握学科的机会就越大


另一方面,如果当你被告知有问题时,你会私下去问一般的互联网社区,你有可能被告知你是对的,你最终会产生一种比你的老师更优越的错误感觉,这将适得其反。

这是错误的,因为你正在访问一个私人会员(您声明了另一个对象的
private int yearOfBirth
),尽管类类型相同。您应该使用您定义的公共getter:
yearOfBirth=other.getYearOfBirth()

出生年份
是一个私有int。因此对
其他.yearofBirth
的调用可能会失败…

正如您所发现的,它会工作。不过,我怀疑存在一个根本性的误解

我的灵力告诉我,你的导师期望代码更像以下:

class Creature {    
   private int yearOfBirth=10;

   public void setYearOfBirth(int year) {
      yearOfBirth = year;
   }

   void setYearOfBirth(Creature other) { 
      yearOfBirth = other.yearOfBirth; // is this correct it compiles fine 
   }

   int getYearOfBirth() { 
      return yearOfBirth;
   } 

   public static void main(String args[])
   {
      Creature c = new Creature();
      c.setYearOfBirth(89);

      Creature d = new Creature();
      c.setYearOfBirth(d);

      System.out.println(c.yearOfBirth);
   }
}
final class Creature   
误解是您只创建了一个类—您的主应用程序类。这实际上使
yearOfBirth
成为一种混合全局值,您可以从主方法访问它。在更典型的设计中,
bioter
是一个完全独立于主方法的类。在这种情况下,您必须只能通过其
公共
界面访问
生物
。您将无法直接访问其私有字段



(请注意:是的,我知道我在简化。)

不,它一点问题都没有

看,这取决于观众的意见。但对于给定的上下文,这段代码可能是完美的

对于其他一些上下文,这可能是不正确的。因此,这取决于如何使用

  • 直接从另一个实例访问私有成员是正确的(但并不总是可取的,例如,当您正在子类化时),这就是为什么它首先是
    private
    。您说的是“嘿,这是我的,我知道如何使用它”

  • 对另外两个方法使用
    default
    access修饰符表示您的意图是它们不应该被包外的其他类使用

也许我唯一要补充的就是让这门课成为期末考试

class Creature {    
   private int yearOfBirth=10;

   public void setYearOfBirth(int year) {
      yearOfBirth = year;
   }

   public void setYearOfBirth(Creature other) { 
      yearOfBirth = other.yearOfBirth;
   }

   public int getYearOfBirth() { 
      return yearOfBirth;
   } 
}

class Program {
   public static void main(String args[]) {
      Creature c = new Creature();
      c.setYearOfBirth(89);

      Creature d = new Creature();
      c.setYearOfBirth(d);

      System.out.println(c.yearOfBirth); // This will not compile
   }
}
如果你想让它可以继承,你可能需要查看出生年份属性的get/set,但是他们认为它对我来说是完美的

现在这里最重要的是了解代码的每个部分都做了什么,以及它如何影响其行为

你不应该仅仅靠运气来编写代码(对不起,我不知道正确的表达方式是什么),但你应该知道每次键入内容时都在做什么,以及打算如何使用它们。

我看到两个“问题”,尽管我不太愿意称它们为错误:

  • 你显式地将生物c的年龄设置为89岁,然后用未初始化的默认值(!)生物d重写该年龄。如果这是你打算做的,那么很好,但至少你浪费了几个周期来设置一个你打算稍后丢弃的值

  • 您可能违反了JavaBeans命名约定

  • 解释后一点:大量Java库和框架(特别是JSP)依靠JavaBeans将对象视为一个组件。我没有深入探讨实际使用的机制,但从我所读到的内容来看,它依靠JavaBeans类的内省来推断属性和这些属性的类型。通过重载setter setYearOfBirth()要同时接受一个int和一个生物,您可以抛开内省(请参阅以获得JavaBeans的详细介绍)

    这没什么大不了的——完全有可能你不会将这个类作为JavaBean使用,如果你这样做了,重构它使其工作起来就很简单了。但是你的老师可能更喜欢一些更干净的东西,比如:

    class Creature {    
       private int yearOfBirth=10;
    
       public void setYearOfBirth(int year) {
          yearOfBirth = year;
       }
    
       void setYearOfBirth(Creature other) { 
          yearOfBirth = other.yearOfBirth; // is this correct it compiles fine 
       }
    
       int getYearOfBirth() { 
          return yearOfBirth;
       } 
    
       public static void main(String args[])
       {
          Creature c = new Creature();
          c.setYearOfBirth(89);
    
          Creature d = new Creature();
          c.setYearOfBirth(d);
    
          System.out.println(c.yearOfBirth);
       }
    }
    
    final class Creature   
    
    现在,您对yearOfBirth的所有访问都是通过公共getter方法进行的,这有助于封装,并且在主方法移动到另一个类时可以防止代码中断


    此外,这还有一个额外的好处,即明确代码的意图,当您开始编写代码供他人维护和修改时,这一点变得越来越重要。

    我没有发现任何错误


    代码之所以有效,是因为一个实例或类可以访问同一类的其他实例的私有成员。这是出于设计。

    Upvoting(不知道为什么被否决)-对我来说,这似乎是一个非常好的入门级问题。你的老师指出,你正在直接访问
    private
    变量
    yearOfBirth
    ,而不是通过
    getYearOfBirth()
    (JavaBean访问)。您能够这样做并编译它的唯一原因是,同一类的任何实例都可以访问
    private
    数据。如果您试图直接从一个
    nonreature
    类访问
    yearOfBirth
    ,编译器肯定会抛出一个错误,您必须使用
    public
    方法d
    getYearOfBirth()
    。你可以问老师,或者你可以问这里成千上万的Java程序员,他们中的许多人会详细地告诉你问题是什么,可能到了你想知道的程度