【问题标题】:Why is an object needed to refer to a class member inside of a static method? [duplicate]为什么需要一个对象来引用静态方法中的类成员? [复制]
【发布时间】:2017-03-31 03:36:54
【问题描述】:

比较我打印此类成员值的方式,在静态方法(main)与非静态方法(打印方法)中。在静态方法中,我需要使用这个类的一个对象,而在非静态方法中,我可以直接引用类成员。

我了解 static 的范围是类范围的,并且与对象无关。有人可以详细说明为什么我需要在静态方法中使用对象,而在非静态方法中不需要它。

public class TreeDriver {
    Tree tree;
    TreeNode p;

    public TreeDriver() {
        tree = new Tree();
        p =null;
    }

    public static void main(String[] args) {
        TreeDriver obj = new TreeDriver();

        obj.print(obj.tree.root, obj.p);
    }

    public void print(TreeNode nodeA, TreeNode nodeB)
    {
        System.out.print(nodeA.val + ", " + nodeB.val);
        System.out.print(tree.root.val + ", " + p.val);
    }
}

【问题讨论】:

    标签: java oop static static-methods


    【解决方案1】:

    print 方法不是静态方法,因此只能在 TreeDriver 类的实例上调用(即不能直接从类中调用,例如 TreeDriver.print(...)

    从您的角度来看,实际上没有办法解决这个问题,因为您在方法中访问实例变量 ptree

    我要补充一点,如果您将驱动程序方法(例如 main(String[] args) 与您的数据模型(即实例变量和 print 方法)分开),它可能会更有意义。

    【讨论】:

      【解决方案2】:

      静态方法不需要调用对象实例。

      在您上面的示例中,另一个类可以像这样调用您的 main 函数。

      TreeDriver.main(args);
      

      请注意,TreeDriver 不是实例化对象。将此与不同类需要调用 print 的方式进行对比。

      TreeDrvier newTreeDrvier = new TreeDriver();
      newTreeDriver.print(nodeA, nodeB);
      

      您需要一个 TreeDriver 对象的实例。成员是为类的实例定义的,而不是为类本身定义的,除非成员本身是静态的,在这种情况下会使其成为 class variable

      【讨论】:

        【解决方案3】:

        根据定义,您不需要实例来调用静态方法。关于“为什么”真的没什么可说的,而不仅仅是“这是静态方法的定义”。

        非静态方法与特定实例相关联。打个比方,如果我告诉你启动汽车,你就去启动一辆特定的汽车——你不能只是抓住钥匙然后在半空中转动它并期望它“工作”。

        【讨论】:

          猜你喜欢
          • 2016-06-19
          • 1970-01-01
          • 2011-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-28
          相关资源
          最近更新 更多