Java多文件和文件夹层次结构
我有多个Java文件,其中一个(Demo)是大多数函数所在的位置,DemoTest1是main所在的位置。 我尝试打包演示文件并在其他文件中使用该包,但是当我使用终端(javac…)编译时,DemoTest1没有编译,因为它还有一个函数,该函数包含一个参数,返回值是演示文件的一个对象 Demo.java文件:Java多文件和文件夹层次结构,java,class,object,compiler-errors,package,Java,Class,Object,Compiler Errors,Package,我有多个Java文件,其中一个(Demo)是大多数函数所在的位置,DemoTest1是main所在的位置。 我尝试打包演示文件并在其他文件中使用该包,但是当我使用终端(javac…)编译时,DemoTest1没有编译,因为它还有一个函数,该函数包含一个参数,返回值是演示文件的一个对象 Demo.java文件: package xyz.mypackage; class Demo{ private double val1; private double val2;
package xyz.mypackage;
class Demo{
private double val1;
private double val2;
private void setValues(double num1, double num2){
val1 = num1;
val2 = num2;
}
private double getValue1(){
return (this.val1);
}
private double getValue2(){
return (this.val2);
}
private double getAverage(){
return((this.val1 + this.val2) / 2);
}
public Demo(double double1, double double2){
this.val1 = double1;
this.val2 = double2;
}
static void decrDemo(Demo obj){
obj.setValues(obj.val1 - 1, obj.val2 - 1);
}
}
import java.util.Scanner;
import xyz.mypackage.Demo;
public class DemoTest1{
static Demo addDemo(Demo obj1, Demo obj2){
return new Demo(obj1.getValue1() + obj2.getValue1(), obj1.getValue2() + obj2.getValue2());
}
static void incrDemo(Demo obj){
obj.setValues(obj.getValue1() + 5, obj.getValue2() + 5);
}
public static void main(){
Demo item = Demo();
System.out.printl("\nPlease enter 2 numbers: ");
Scanner input = new Scanner(System.in);
double val1 = input.nextDouble();
double val2 = input.nextDouble();
demo.setValues(val1, val2);
System.out.printl("\nThe average of the two values entered is: " + item.getAverage());
Demo obj1 = new Demo(5, 7),
obj2 = new Demo(14, 9);
Demo objR = addDemo(obj1, obj2);
incrDemo(obj1);
System.out.printl("\nobjR has the following values. val1: &d\tval2: &d", objR.getValue1(), objR.getValue2());
System.out.printl("\nobj1 has the following values. val1: &d\tval2: &d", obj1.getValue1(), obj1.getValue2());
}
}
demost1.java文件:
package xyz.mypackage;
class Demo{
private double val1;
private double val2;
private void setValues(double num1, double num2){
val1 = num1;
val2 = num2;
}
private double getValue1(){
return (this.val1);
}
private double getValue2(){
return (this.val2);
}
private double getAverage(){
return((this.val1 + this.val2) / 2);
}
public Demo(double double1, double double2){
this.val1 = double1;
this.val2 = double2;
}
static void decrDemo(Demo obj){
obj.setValues(obj.val1 - 1, obj.val2 - 1);
}
}
import java.util.Scanner;
import xyz.mypackage.Demo;
public class DemoTest1{
static Demo addDemo(Demo obj1, Demo obj2){
return new Demo(obj1.getValue1() + obj2.getValue1(), obj1.getValue2() + obj2.getValue2());
}
static void incrDemo(Demo obj){
obj.setValues(obj.getValue1() + 5, obj.getValue2() + 5);
}
public static void main(){
Demo item = Demo();
System.out.printl("\nPlease enter 2 numbers: ");
Scanner input = new Scanner(System.in);
double val1 = input.nextDouble();
double val2 = input.nextDouble();
demo.setValues(val1, val2);
System.out.printl("\nThe average of the two values entered is: " + item.getAverage());
Demo obj1 = new Demo(5, 7),
obj2 = new Demo(14, 9);
Demo objR = addDemo(obj1, obj2);
incrDemo(obj1);
System.out.printl("\nobjR has the following values. val1: &d\tval2: &d", objR.getValue1(), objR.getValue2());
System.out.printl("\nobj1 has the following values. val1: &d\tval2: &d", obj1.getValue1(), obj1.getValue2());
}
}
错误输出:
Air:Project xyz$ javac Demo.java DemoTest1.java
DemoTest1.java:2: xyz.mypackage.Demo is not public in xyz.mypackage;
cannot be accessed from outside package
import xyz.mypackage.Demo;
^
./Demo.java:3: duplicate class: xyz.mypackage.Demo
class Demo
^
DemoTest1.java:6: cannot access Demo
bad class file: ./Demo.java
file does not contain class Demo
Please remove or make sure it appears in the correct subdirectory of
the classpath.
static Demo addDemo(Demo obj1, Demo obj2)
如果我按照正确的说明操作,它应该会运行,但我想DemoTest1中并没有包含DemoDemo,我不理解这一点,因为我使用了打包。或者我是否需要编译不同于使用javac的文件。。然后用java运行DemoTest1
编辑:更改文件夹层次结构和修复语法错误使其成功编译,但在尝试运行它(java DemoTest1)时,我发现:
Exception in thread "main" java.lang.NoSuchMethodError: main
Edit2:异常已修复。虽然main()已经足够了,但它需要main(字符串args[])。
现在它工作得很完美,正如它的初衷。我感谢您的帮助和学习机会
解决方案:适用于寻找类似问题的任何人。我在使用包时编写了xyz.mypackage,因此它必须位于这些文件夹/子文件夹中(我认为,它本身就是包的常规语法,不管文件夹如何),还必须添加默认构造函数,因为我添加了一个特殊构造函数,我错误地认为如果没有参数,它将只使用常规构造函数。
除了一些小的语法错误(没有正确使用println或使用%d而不是&f等)之外,另一个问题是main()不能为空,它需要有一个参数(字符串args[])。您需要将Demo类声明为public。如果您可以检查错误,它确实明确提到了相同的错误
import java.util.Scanner;
public class DemoTest1 {
static Demo addDemo(Demo obj1, Demo obj2) {
return new Demo(obj1.getValue1() + obj2.getValue1(),
obj1.getValue2() + obj2.getValue2());
}
static void incrDemo(Demo obj) {
obj.setValues(obj.getValue1() + 5, obj.getValue2() + 5);
}
public static void main(String args[]) {
Demo item = new Demo(0, 0);
System.out.println("\nPlease enter 2 numbers: ");
Scanner input = new Scanner(System.in);
double val1 = input.nextDouble();
double val2 = input.nextDouble();
item.setValues(val1, val2);
System.out.println("\nThe average of the two values entered is: "
+ item.getAverage());
Demo obj1 = new Demo(5, 7);
Demo obj2 = new Demo(14, 9);
Demo objR = addDemo(obj1, obj2);
incrDemo(obj1);
System.out.printf("\nobjR has the following values. val1: %.2f\tval2: %.2f",
objR.getValue1(), objR.getValue2());
System.out.printf("\nobj1 has the following values. val1: %.2f\tval2: %.2f",
obj1.getValue1(), obj1.getValue2());
}
}
演示类很好,但是这样试试应该可以。测试类中有一些语法错误。要调用double,可以使用
%.2f
表示小数点后两位的double,而不是原来的double。您也不需要将它们放入新的包或类似的东西中。我认为这里可能有一些问题:
在Demost1中,您应该进行更改
import xyz.mypackage.Demo;
到
及
到
在演示中,您应该进行更改
class Demo
到
并添加默认构造函数,因为您在DemoTest1文件中引用了一个构造函数
差不多
public Demo() {
val1 = 0.0
val2 = 0.0
}
是的,刚刚修好了。到达那里。出现语法错误,文件夹层次结构错误。现在它可以编译了,但当试图运行它时,我得到了一个新的错误..谢谢,我想&d对于一个小数来说已经足够了。我也不知道它需要包含main的参数。它现在工作得很漂亮,在研究的过程中我又学到了。
public class Demo
public Demo() {
val1 = 0.0
val2 = 0.0
}