如何在Java中使用构造函数[已关闭]

问题描述 投票:0回答:5

我的程序构建遇到问题。我似乎找不到在哪里或为什么需要将构造函数放入其中。我无法判断它是否在那里。无论如何,这是主要代码:

import java.io.FileNotFoundException;
import java.util.Scanner;

public class HangmanProject
{
    public static void main(String[] args) throws FileNotFoundException
    {
        public static void getFile() {

    getFile gf() = new getFile();
    Scanner test = gf.wordScan;      
   }     
}

这就是主程序,但它调用了这个:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Scanner;

public class getFile 
          {  
    String wordList[] = new String[10];    // array to store all of the words
    int x = 0;
        
    Scanner keyboard = new Scanner(System.in);    // to read user's input

    System.out.println("Welcome to Hangman Project!");

                                 // Create a scanner to read the secret words file
    Scanner wordScan = null;

    try {
        wordScan = new Scanner(new BufferedReader(new FileReader("words.txt")));
        while (wordScan.hasNext()) {
            wordList[x] = wordScan.next();  
            System.out.println(wordList[x]);  
            x++;  
                                   }
        } 
    finally {
        if (wordScan != null)
        {
            wordScan.close();
        }
    }
}

我的问题是:

  • 我的构造函数在哪里,
  • 我的使用方法正确吗?
  • 我的布局应该改变吗?

我的老师告诉我:“我仍然没有在你的类中看到构造函数方法,你应该在其中初始化类的实例变量。你不能只将代码放入类中。”我真的不明白这意味着什么。

java layout constructor initialization
5个回答
2
投票

构造函数是在 Java 和其他 OO 语言中初始化对象的特殊子例程。如果您不声明构造函数,类将具有隐式默认构造函数(不执行任何操作并返回)。

问题评论中提到的代码的其他问题是它根本无法编译。您不能将代码放入不是字段或类声明的类主体中。非类或字段声明的代码必须存在于构造函数、方法、静态方法、初始值设定项或静态初始值设定项中。

Oracle 自己的 Java 教程是开始学习 Java 语言的绝佳资源。这些教程可以在 Oracle 网站上找到,第一个教程(下面链接为 Trail:入门)将帮助您编写和理解您的第一个 Java 程序。对于当前的特定问题,解释类和对象的使用的教程(也在下面链接)将很有用。

一旦你进一步了解,你可能会发现你能够针对你所坚持的概念提出更具体的问题。

线索:入门

课程:类和对象

Java 教程


1
投票

首先,我对你的程序做了一些修改。您的第一个大错误是您有一个名为 getFile 的类,以及一个名为 getFile 的方法。将方法名称保留为方法名称,但类名称通常大写。我把它改成了GetFile。

import java.util.*;
import java.io.*;
public class HangmanProject{
   public static void main(String[] args) throws FileNotFoundException{ //this is the first thing that runs, the main method
      GetFile gf = new GetFile();  //this will create the getFile object
      try {
         gf.getWords(); //runs the method that we make later
      }
      catch(FileNotFoundException potatoes) {   //this will print out error message if there is no words.txt
         System.out.println(potatoes.getMessage());
      }                                
    } //closes main method
}

好的;现在进入实际的课程本身。

import java.util.*;
import java.io.*;
public class GetFile {        
    //Here are your variables
    private String[] wordList = new String[10];   
    private int x = 0;                             
    //good practice to have variables private;
    //Now it is time for the constructor.
    public GetFile() 
       { 
     //empty constructor; you don't need to have any instance variables declared.
       } 
    public void getWords() throws FileNotFoundException {  //the big method for doing stuff
        Scanner keyboard = new Scanner(System.in);    // to read user's input
        System.out.println("Welcome to Hangman Project!");
        Scanner wordScan = null;
        wordScan = new Scanner(new File("words.txt"));
        while (wordScan.hasNext()) { //checking if there are more words
            wordList[x] = wordScan.next();  
            System.out.println(wordList[x]);  //print them out as the array is filled
            x++;  
            }
        if (wordScan != null)
           {
           wordScan.close(); //close the file after you are finished
           }
    }
}

1
投票

您可以将构造函数视为与类同名且没有返回类型的特殊方法。

所以如果类名是

HangmanProject

构造函数应该是

public HangmanProject(){
}

其次,它应该位于其构造函数所在的类中......

class HangmanProject{
    public HangmanProject(){
    }
}

最后它也可以接受参数;并且您可以重载它们,即您可以在一个类中拥有多个构造函数。

class HangmanProject{
    Integer attemptsLeft;
    public HangmanProject(){
        attemptsLeft = 10;
    }

    public HangmanProject(Integer attempts){
        this.attemptsLeft = attempts;
    }

}

构造函数的用途是初始化类的字段。

以您的其他课程为例...

public class GetFile {    //  Changed as per naming convention...

     String wordList[];
     int x;
     Scanner keyboard = null;    // to read user's input
     Scanner wordScan = null;

     public GetFile(){     // Here is the constructor
         this.wordList = new String[10];
         this.x=0;
     }

}

希望这对你有帮助!!!


1
投票

不同的 Java 程序员可以有不同的编程风格和方法。通过使用标准 Java 命名约定,他们可以使自己和其他程序员更容易阅读代码。 Java 代码的可读性很重要,因为这意味着花更少的时间去弄清楚代码的作用,从而留出更多的时间来修复或修改它。

为了说明这一点,值得一提的是,大多数软件公司都会有一份文档,概述他们希望程序员遵循的命名约定。熟悉这些规则的新程序员将能够理解可能已经离开公司很多年的程序员编写的代码。

Java 编程语言的代码约定


0
投票

这里是我尝试解决大多数使用 java 的问题的示例 :-) 将来特别考虑使用像 Eclipse 这样的 IDE 进行编程 http://www.eclipse.org/downloads/ 并学习 java 的基础知识在尝试更复杂的事情之前。

首先将“Hello world”打印到控制台是一种方法,然后逐步进行,创建另一个类(可能是两个),创建它们的一些实例,并使它们也将消息打印到控制台。做事不要着急!学习基础知识是你将来遇到的每一种语言都必须的,祝你旅途顺利! :)

Main.java

   public class Main
    {
        public static void main(String[] args)
        {

          System.out.println("Welcome to Hangman Project!");

          // lets initialize your FileHandler class, this will call its constructor btw.
          FileHandler fileHandler = new FileHandler();

          // and lets call its method after that
          fileHandler.readFile();

       }     

    }

FileHandler.java

public class FileHandler{

   // place for your attributes belonging to full class

   // Im the constructor
   public FileHandler() {
         // you can do something here like your initializations for attributes
         System.out.println("FileHandler instance created!");
   }

   public void readFile() {
         // do your file reading here
         System.out.println("FileHandler readfile() called!");
   }

}

© www.soinside.com 2019 - 2024. All rights reserved.