比较我打印此类成员的值的方式,在静态方法(主要)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);
}
}
答案 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)
根据定义,您不需要实例来调用静态方法。关于“为什么”而不仅仅是“这是静态方法的定义”,没有什么可说的了。“
非静态方法与特定实例相关联。作为类比,如果我告诉你启动汽车,你就可以开始使用特定的汽车 - 你不能只是抓住钥匙并在半空中转动并期望它“起作用”。