如何在JAVA中调用同一包中其他类的方法或访问字段



我是JAVA编程的初学者。我正在做我的课程项目,正在创建一个游戏。我为这个游戏创建了两个类,它们在同一个包中。在类B中,我需要从类A调用方法,并访问字段。代码应该如何访问在类A中定义的方法?我在网上搜索了解决方案,有人建议编写代码像这样:

Classname.methodname(args)

然而,存在编译错误(我认为)

error: cannot find symbol  public A newA;  symbol:   class A    location: class B

我写的代码是这样的:

newA.moveRight(A.getANumber());

我从这节课中学到的一个方法是扩展类以访问该方法。但是这是两个不同的类,所以我不能扩展这个类。

有人能告诉我我犯错误的原因或这个问题的解决方案吗?非常感谢你的帮助。

解决这个问题有两种方法。第一个是使方法成为静态的,第二个是使另一个类成为实例。

假设您必须使用类ClassAClassB

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);

最新更新