我是JAVA编程的初学者。我正在做我的课程项目,正在创建一个游戏。我为这个游戏创建了两个类,它们在同一个包中。在类B中,我需要从类A调用方法,并访问字段。代码应该如何访问在类A中定义的方法?我在网上搜索了解决方案,有人建议编写代码像这样:
Classname.methodname(args)
然而,存在编译错误(我认为)
error: cannot find symbol public A newA; symbol: class A location: class B
我写的代码是这样的:
newA.moveRight(A.getANumber());
我从这节课中学到的一个方法是扩展类以访问该方法。但是这是两个不同的类,所以我不能扩展这个类。
有人能告诉我我犯错误的原因或这个问题的解决方案吗?非常感谢你的帮助。
解决这个问题有两种方法。第一个是使方法成为静态的,第二个是使另一个类成为实例。
假设您必须使用类ClassA
和ClassB
A类
ClassA
没有静态方法和公共初始值设定项,因此从ClassA
调用方法的唯一方法是创建它的实例
public class ClassA{
public ClassA(){
//Intentionally blank
}
public void doSomething(int anInt){
//Intentionally blank
}
public int doSomethingElse(){
return -1;
}
}
ClassB
ClassB
有一个私有初始值设定项和静态方法,因此它是不可实例化的,并且它的方法可以在没有类实例的情况下调用。
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();
)才能调用其方法。这是因为这些方法不是类方法。
要从ClassB
调用方法,只需使用类名(ClassB.doSomethingElse();
)即可访问它们。使用ClassB
可以做到这一点的原因是,它的方法是static
,因此是类成员。
摘要
方法必须是静态的,才能通过类名调用其方法,否则您将需要该类的实例。
这是关于类实例化的oracles教程。这是关于类成员的oracles教程。
我建议您通读它们,以便充分了解继承、静态成员等。
使用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);