【问题标题】:Java Classes are extremely confusing to meJava 类让我非常困惑
【发布时间】:2011-04-28 14:10:39
【问题描述】:

我在理解 Java 中的类时遇到了一些问题。

比如你如何在helper类中这样声明“Inputter”?

public class Helper
{
     public void Helper(String z)
     {
          if(z.length() == 0)
          {
               System.out.println("You can't leave it blank!");
               System.exit(1);
               System.out.println("It's not working... ;(");
          }
     }

     public void Inputter(int a)
     {
          // blah blah
     }
}

你会这样称呼它吗?

Helper x = new Inputter();

请帮忙,不,这不是家庭作业问题。

谢谢, 微笑

编辑:这样对吗:

public class Helper
{
     public Helper(String z)
     {
          if(z.length() == 0)
          {
               System.out.println("You can't leave it blank!");
               System.exit(1);
               System.out.println("It's not working... ;(");
          }
     }

     public void Inputter(int a)
     {
          // blah blah
     }
}

并声明为:

Helper x = Helper();

感谢大家对 StackOverflow 的热烈欢迎! :D

【问题讨论】:

  • 通过教程掌握基础知识:download.oracle.com/javase/tutorial
  • 我建议您遵循 Java Coding Convension 并使用 camelCase 作为方法名,使用大写作为类名。这样您就不会混淆方法名和类名。当你可以抛出异常时,也永远不要调用 System.exit(),比如throw new IllegalArgumentException("You can't leave it blank!")
  • @BalusC 那么如何将它们声明为类?我唯一感到困惑的是 IllegalArgumentException (我现在有点搞不清楚)以及类和方法。

标签: java oop class subclass


【解决方案1】:

您的问题不在于类,而在于构造函数和方法,以及它们之间的区别。

方法可以有任何你喜欢的名字,它们必须声明一个返回类型(可能是void),它们的名字是这样的:

ReturnType r = methodName(param1, param2)

构造函数用于创建类(对象)的实例。它们必须与类同名,它们不能有返回类型(甚至void),它们的名称如下:

MyClass m = new MyClass(param1, param2);

你的代码有几个问题:

  • Helper 具有正确的构造函数名称,但由于它声明了 void 返回类型,编译器会将其视为方法。
  • Inputter 甚至没有构造函数的正确名称。要将其用作new 的构造函数,它必须是名为Inputter 的类的一部分

也许您应该开始阅读 Java 教程的 introduction to OO 部分。

【讨论】:

  • @micheal-borgwardt 谢谢!
【解决方案2】:

您定义的 Inputter() 是一种方法,或者您可以将其称为行为。您不能为行为创建实例。

另一个问题是构造函数不能有返回类型。 Helper 是类名,构造函数的返回类型不正确

关于你的问题,如果你想调用 Inputter,你应该这样做。

Helper helper = new Helper("test");
helper.Inputter(100);

最好以小写字母开头方法。

【讨论】:

  • 小写是什么意思?如:输入器?
【解决方案3】:

这里唯一的对象是 Helper。如果你想创建一个新的助手,那么你将通过说来实例化它

Helper X = new Helper("blah blah");

如果你想调用 Inputter 那么你就说

X.Inputter(1234);

这将为 Helper 的特定实例 X 调用 Inputter 函数

【讨论】:

    【解决方案4】:

    您必须先创建Helper 的实例,然后才能使用Inputter

    Helper x = new Helper("some string");
    

    使用Inputter,试试这个:

    //create a new helper
    Helper x = new Helper("some string"); 
    //use the Inputter method of the helper.
    x.Inputter(1); 
    

    这里要理解的是Helper是类,x是类的实例Inputter实例方法(这与Helper 类中的静态方法不同。

    【讨论】:

      【解决方案5】:

      您的代码中的 Inputter 不是一个类。这是一种方法。

      使以下陈述正确:

      Helper x = new Inputter();
      

      您需要创建 扩展 Helper 类的 Inputter 类。

      【讨论】:

        【解决方案6】:

        Inputter 不是一个类。这是Helper 类的方法。所以你不能实例化它。

        【讨论】:

          【解决方案7】:

          你可以这样称呼它

          String someString = "some string";
          Helper x = new Helper(someString);
          int someInt = 1;
          x.Inputter(someInt);
          

          【讨论】:

            【解决方案8】:

            new 关键字保留用于实例化(表示“创建新”的花哨词)类。您的课程的制作方式,当您创建一个新的Helper 时,会运行一个函数。那就是构造函数,名字跟类一样。

            一旦你实例化了一个类,你就可以访问其中的好东西(例外是static 方法/属性,任何人都可以访问它);所有不在privateprotected 的类中。

            现在,简要介绍 OOP(面向对象编程): 你有类,它们基本上是功能块。在这些类中有两件事:方法和属性(有很多名称,但我就是这么称呼它们的。)

            方法基本上是一个很好的 ol` 函数:它有一个输入和一个输出。 属性真的和其他任何变量一样。

            现在,在 Java 和许多其他 OO 语言中,类声明和类实例之间存在分离。类声明基本上是静态编码类;正是您在代码中输入的内容。类实例获取类声明并将其投入使用:您可以更改和使用其中的方法和属性。

            所以,如果你想调用 Inputter,你应该这样做:

            Helper bob = new Helper('Bloop');
            bob.Inputter(42);
            

            这里发生了什么?我们创建了一个名为bob 的新变量,其类型为Helper。在构造新的 Helper 时,我们还运行构造函数。查看构造函数,我们给它传了一个值(本例中为'Bloop'),函数正常运行,无需我们手动调用。

            现在我们要使用 Helper 类的 Inputter 方法。为此,我们需要使用bob.(注意点)访问Helper 类的实例(在我们的例子中为bob),然后像任何其他函数一样调用它:Inputter(parameters)。将它们粘合在一起,我们得到bob.Inputter(parameters)

            这是对面向对象的一个​​非常蹩脚的解释,并没有涵盖那么多,但它应该可以帮助您入门。我建议买一本关于 Java 的书或阅读在线教程。

            【讨论】:

              【解决方案9】:

              首先,从基础开始。

              类最能代表名词。这意味着类是(通常)事物的模型。方法最能代表这些名词上的动词。偏离这个理想有时是必要的;然而,你离这样的理想越远,就越难理解发生了什么。对例外情况表示赞同,因为您是初学者,所以我们不要陷入例外情况,而是要遵守规则。

              public class Person {
              
                 private String name;
              
                 private int age;
              
                 public Person(String name) {
                   this.name = name;
                   this.age = -1;
                 }
              
                 public void setAge(int value) {
                   if (value < 0) {
                     throw new IllegalArgumentException("Age must be greater than zero");
                   }
                   this.age = value;
                 }
              
                 public int getAge() throws IllegalStateException {
                   if (age < 0) {
                     throw new IllegalStateException("Age was not set");
                   }
                   return this.age;
                 }
              }
              

              通读上面的课程,并将其风格用于您的开始程序。当你发现它的风格对你的阻碍多于帮助你时,那么你可能已经找到了一个需要其他技术的地方。

              【讨论】:

                猜你喜欢
                • 2014-08-17
                • 2010-12-14
                • 1970-01-01
                • 2011-03-14
                • 2018-06-18
                • 1970-01-01
                相关资源
                最近更新 更多