如何解决实体类和封装混淆-如何从main调用非静态方法?
我正在创建一个名为“ Crate”的类,该类将读取表示对象尺寸(以英寸为单位)的整数输入文件,并输出包含每个项目所需的板条尺寸的报告。在尝试测试方法之前,一切似乎都还不错,因为无法从main()调用它们。尝试时,我收到一条错误消息,指出“无法从静态上下文引用非静态方法createReport()。”
我是一个初学者,因此,如果根本上有任何错误,我都会很乐意接受批评。我只是想知道是否有一个简单的解决方案,以及我在静态/非静态方法方面的知识空白。
package crate;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Crate {
private Crate[] crateList;
private int crateAmount;
private int height,width,depth,panels;
private int smallestCratePosition,smallestCrateSize;
private int largestCratePosition,largestCrateSize;
private double averageCrateSize;
public static void main(String[] args) throws IOException {
createReport();
}
public Crate() {
height = 1;
width = 1;
depth = 1;
panels = 6;
}
public void createReport() throws IOException {
Scanner infile = new Scanner(new File("ShippingSizes.txt"));
PrintWriter outfile = new PrintWriter(new File("CrateReport.txt"));
createCrateList(infile);
outfile.println("There are " + crateAmount + " crates.");
for (int i = 0; i < crateList.length; i++) {
outfile.println(i + ": height=" + crateList[i].getHeight() + ",width=" +
crateList[i].getWidth() + ",depth=" + crateList[i].getDepth() +
",panels=" + crateList[i].getPanels());
}
outfile.println("\n" + "Smallest crate is at " + smallestCratePosition +
": height=" + crateList[smallestCratePosition].getHeight() + ",width=" +
crateList[smallestCratePosition].getWidth() + ",depth=" +
crateList[smallestCratePosition].getDepth() + ",panels=" +
crateList[smallestCratePosition].getPanels());
outfile.println("Largest crate is at " + largestCratePosition + ": height," +
crateList[largestCratePosition].getHeight() + ",width=" +
crateList[largestCratePosition].getWidth() + ",depth=" +
crateList[largestCratePosition].getDepth() + ",panels=" +
crateList[largestCratePosition].getPanels());
outfile.println("Average crate size is: " + averageCrateSize);
outfile.close();
infile.close();
}
public void setCrateDimensions(Scanner scnr) {
int tempValue = scnr.nextInt();
height = tempValue/12;
if (tempValue%12 != 0)
height++;
tempValue = scnr.nextInt();
width = tempValue/12;
if (tempValue%12 != 0)
width++;
tempValue = scnr.nextInt();
depth = tempValue/12;
if (tempValue%12 != 0)
depth++;
panels = 2*((height*width)+(height*depth)+(width*depth));
}
public void createCrateList(Scanner scnr) {
crateAmount = scnr.nextInt();
for (int i = 0; i < crateAmount; i++) {
crateList[i].setCrateDimensions(scnr);
}
}
public void getSmallestCrate() {
smallestCrateSize = crateList[0].getPanels();
for (int i = 0; i < crateList.length; i++) {
if (crateList[i].getPanels() < smallestCrateSize) {
smallestCratePosition = i;
smallestCrateSize = crateList[i].getPanels();
}
}
}
public void getLargestCrate() {
largestCrateSize = crateList[0].getPanels();
for (int i = 0; i < crateList.length; i++) {
if (crateList[i].getPanels() > largestCrateSize) {
largestCratePosition = i;
largestCrateSize = crateList[i].getPanels();
}
}
}
public void getAverageCrateSize() {
double totalPanels = 0;
for (int i = 0; i < crateList.length; i++)
totalPanels += crateList[i].getPanels();
averageCrateSize = totalPanels / (double)(crateList.length);
}
public int getHeight() {
return height;
}
public int getWidth() {
return width;
}
public int getDepth() {
return depth;
}
public int getPanels() {
return panels;
}
}
我尝试在main()内声明Scanner,PrintWriter,Crate []对象和crateAmount整数,但是由于后来无法在我的方法中使用这些变量,这只会导致相同的问题。任何帮助将不胜感激!
解决方法
因为createReport
方法与其类分类器的实例有关。
您必须使用new
关键字创建一个实例,然后才能调用它的方法createReport
。
另一种方法,如果您不想创建类的实例,则可以通过关键字static
将方法声明为静态方法。那么启动jvm时将加载该方法。
建议:您应该通过阅读书籍或其他文章来深入了解OOP编程
,非静态方法属于类的实例,而不是类本身。这就是为什么您不能从createReport()
访问main()
方法的原因,因为main在静态范围内,而createReport不是。尝试实例化该类的实例,然后在对象上调用createReport()
。
例如:
Crate crate = new Crate();
crate.createReport();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。