关于Java中静态方法与非静态方法之间的互相调用问题

来源:互联网 发布:vb软件可以生成app 编辑:程序博客网 时间:2024/06/04 18:03

最近在学java,遇到如题所示问题:

1.在静态方法中可以直接调用所在类的其他静态方法,却不可以直接调用非静态方法,而必须通过实例化之后调用非静态方法;

2.与此相对的,在非静态方法中却可以直接调用所在类的所有静态方法和非静态方法。

以下提出自己的一些理解,小生是java新手,望诸位路过的大侠不要取笑,也希望各位批评指正。


一、问题的提出

源程序thinking in java中的一段:

<script src="https://code.csdn.net/snippets/472622.js"></script>

1.我试着将f()和 g()方法前面额static关键字去掉,发现报错

意思是说不能在引用非静态方法。

也就是说:静态方法main()中可以直接调用静态方法,却不能直接调用非静态方法。

2.在main()方法中实例化VarargType对象,利用对象就可以调用非静态方法f()和g(),代码如下:

<script src="https://code.csdn.net/snippets/472634.js"></script>

也就是说可以通过在静态方法中实例化一个对象调用非静态方法。

3.在第二个代码片中,我们还可以发现非静态方法g()对非静态方法f()的调用,以及在下面的代码片中非静态方法g()对静态方法f()的调用

<script src="https://code.csdn.net/snippets/472637.js"></script>

二、自己的一些理解

在java语言中,非静态方法只能由对象来调用,而静态方法既可以由对象来调用,也可以由类来调用(这种方式也是thinking in java中所建议的)。在对象作为调用主体时,调用过程中涉及到java中的对象引用传递机制。也就说:调用的过程中如何确定是由哪个对象去调用的(这是必要的)。而在类作为调用主体时,这是不需要的。具体的实现机制就不细说了,大概意思是说,java的底层实现机制会将该对象引用作为一个参数传递出去,以确定是哪个对象调用的。

在非静态方法中,因为已存在当前对象的引用,因而可以直接调用静态方法(无需传递对象引用):如VarargType3.java 中g()方法对f()的调用;也可以直接调用其他非静态方法(传递对象引用):如VarargType2.java 中g()方法在调用f()方法过程中,将g()中的对象引用传递给f()方法。

在静态方法中,不存在当前对象的引用(甚至都不存在当前对象)。当直接调用静态方法时不存在问题,如VarargType.java 中main()方法对f()方法的调用;当直接调用非静态方法时,因为无法传递给非静态方法一个对象引用,所以会报错。但这可以通过实例化一个对象来解决,继而将对象的引用传递给非静态方法。

查看以下代码:

<script src="https://code.csdn.net/snippets/472716.js"></script>

通过实例化一个对象var,即可在非静态main中调用静态方法f()和g().





0 0