如何在 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、ClassAClassB

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 教程。

我建议您通读它们以全面了解继承、静态成员等。