如何在 JAVA 的同一包中调用方法或从其他 class 访问字段
How can I invoke a method or access a field from other class in the same package in JAVA
我是 JAVA 编程的初学者。我正在研究我的课程项目,该项目正在创建游戏。我为这个游戏创建了 2 个 classes,它们在同一个包中。在 class B 中,我需要调用 class A 中的方法,并访问该字段。代码应该如何访问class A 中定义的方法?我在网上搜索了解决方案,有人建议写代码
像这样:
Classname.methodname(args)
但是,有一个编译错误(我认为)
error: cannot find symbol public A newA; symbol: class A location: class B
我写的代码是这样的:
newA.moveRight(A.getANumber());
我从课程中学到的一种方法是扩展 class 来访问该方法。但是那些是 2 个不同的 class 所以我不能扩展 class.
谁能告诉我我犯错的原因或这个问题的解决方案?非常感谢您的帮助。
使用 Java 反射可以轻松调用方法和访问字段。
Class<?> clazzA = ClassA.class;
ClassA objectA = new ClassA();
Method method = clazzA.getMethod(methodName, parasType);
method.setAccessible(true);
method.invoke(objectA,paras);
Field field = clazzA.getField(fieldName);
field.setAccessible(true);
Object fieldType = field.get(objectA);
有两种方法可以解决这个问题。第一个是使方法静态化,第二个是创建另一个实例 class.
假设您必须 classes、ClassA
和 ClassB
A类
ClassA
没有静态方法和 public 初始值设定项,因此从 ClassA
调用方法的唯一方法是创建它的实例。
public class ClassA{
public ClassA(){
//Intentionally blank
}
public void doSomething(int anInt){
//Intentionally blank
}
public int doSomethingElse(){
return -1;
}
}
B级
ClassB
有一个私有初始化器和静态方法,因此它是不可实例化的,并且可以在没有 class.
实例的情况下调用它的方法
public class ClassB{
private ClassB(){
//Intentionally blank
}
public static void doSomething(int anInt){
//Intentionally blank
}
public static int doSomethingElse(){
return -1;
}
}
现在假设你有这个代码:
public class ClassMain{
public static void main(String... args){
ClassB classB = new ClassB();//Will throw an error
ClassA classA = new ClassA();//Will compile fine
ClassB.doSomething(ClassB.doSomethingElse());//Will compile fine
classB.doSomething(classB.doSomethingElse());//Will give a warning
ClassA.doSomething(ClassA.doSomethingElse());//Will throw an error
classA.doSomething(classA.doSomethingElse());//Will compile fine
}
}
要从 ClassA
调用方法,您需要定义一个实例 (ClassA classA = new ClassA();
) 以便调用其方法。这是因为这些方法不是 class 方法。
要从 ClassB
调用方法,您只需使用 class 名称 (ClassB.doSomethingElse();
) 即可访问它们。您可以使用 ClassB
执行此操作的原因是因为它的方法是 static
并且因此是 class 成员。
总结
方法必须是静态的,这样它的方法才能被 class 名称调用,否则您将需要 class.
的实例
This 是关于 class 实例化的 oracles 教程。
This 是关于 class 成员的 oracles 教程。
我建议您通读它们以全面了解继承、静态成员等。
我是 JAVA 编程的初学者。我正在研究我的课程项目,该项目正在创建游戏。我为这个游戏创建了 2 个 classes,它们在同一个包中。在 class B 中,我需要调用 class A 中的方法,并访问该字段。代码应该如何访问class A 中定义的方法?我在网上搜索了解决方案,有人建议写代码 像这样:
Classname.methodname(args)
但是,有一个编译错误(我认为)
error: cannot find symbol public A newA; symbol: class A location: class B
我写的代码是这样的:
newA.moveRight(A.getANumber());
我从课程中学到的一种方法是扩展 class 来访问该方法。但是那些是 2 个不同的 class 所以我不能扩展 class.
谁能告诉我我犯错的原因或这个问题的解决方案?非常感谢您的帮助。
使用 Java 反射可以轻松调用方法和访问字段。
Class<?> clazzA = ClassA.class;
ClassA objectA = new ClassA();
Method method = clazzA.getMethod(methodName, parasType);
method.setAccessible(true);
method.invoke(objectA,paras);
Field field = clazzA.getField(fieldName);
field.setAccessible(true);
Object fieldType = field.get(objectA);
有两种方法可以解决这个问题。第一个是使方法静态化,第二个是创建另一个实例 class.
假设您必须 classes、ClassA
和 ClassB
A类
ClassA
没有静态方法和 public 初始值设定项,因此从 ClassA
调用方法的唯一方法是创建它的实例。
public class ClassA{
public ClassA(){
//Intentionally blank
}
public void doSomething(int anInt){
//Intentionally blank
}
public int doSomethingElse(){
return -1;
}
}
B级
ClassB
有一个私有初始化器和静态方法,因此它是不可实例化的,并且可以在没有 class.
public class ClassB{
private ClassB(){
//Intentionally blank
}
public static void doSomething(int anInt){
//Intentionally blank
}
public static int doSomethingElse(){
return -1;
}
}
现在假设你有这个代码:
public class ClassMain{
public static void main(String... args){
ClassB classB = new ClassB();//Will throw an error
ClassA classA = new ClassA();//Will compile fine
ClassB.doSomething(ClassB.doSomethingElse());//Will compile fine
classB.doSomething(classB.doSomethingElse());//Will give a warning
ClassA.doSomething(ClassA.doSomethingElse());//Will throw an error
classA.doSomething(classA.doSomethingElse());//Will compile fine
}
}
要从 ClassA
调用方法,您需要定义一个实例 (ClassA classA = new ClassA();
) 以便调用其方法。这是因为这些方法不是 class 方法。
要从 ClassB
调用方法,您只需使用 class 名称 (ClassB.doSomethingElse();
) 即可访问它们。您可以使用 ClassB
执行此操作的原因是因为它的方法是 static
并且因此是 class 成员。
总结
方法必须是静态的,这样它的方法才能被 class 名称调用,否则您将需要 class.
的实例This 是关于 class 实例化的 oracles 教程。 This 是关于 class 成员的 oracles 教程。
我建议您通读它们以全面了解继承、静态成员等。