为什么对象需要引用静态方法中的类成员?

时间:2017-03-31 03:36:55

标签: java oop static static-methods

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

我知道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);
    }
}

3 个答案:

答案 0 :(得分:1)

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

从您的角度来看,由于您正在访问方法中的实例变量TreeDriver.print(...)p,因此无法解决这个问题。

我想补充一点,如果你将驱动程序方法(例如tree)从数据模型中分离出来(例如实例变量和main(String[] args)方法),它可能更有意义。

答案 1 :(得分:0)

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

在上面的例子中,另一个类可以像这样调用你的主函数。

TreeDriver.main(args);

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

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

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

答案 2 :(得分:0)

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

非静态方法与特定实例相关联。作为类比,如果我告诉你启动汽车,你就可以开始使用特定的汽车 - 你不能只是抓住钥匙并在半空中转动并期望它“起作用”。