黑马程序员技术交流社区

标题: 关于静态不能调用非静态的问题 [打印本页]

作者: 刘凯旋    时间: 2014-3-10 13:00
标题: 关于静态不能调用非静态的问题
如果被调用的方法它就是非静态的,在不改变方法为静态的情况下静态如何能调用这个非静态呢?说说原理,比如this什么的,还有就是成员不是静态的在不改变成员为静态的前提下该如何调用?

作者: 刘望望    时间: 2014-3-10 13:43
在静态方法中调用非静态方法或成员变量的时候,可以通过要调用方法或成员的类的对象来调用,就像main方法中一样。
成员方法和成员变量(私有除外)都可以通过该类的对象调用,无论是在外部还是静态块中。
之所以无法在静态块中直接访问非静态成员,可以理解成静态块要比非静态加载早
作者: 无此姓名    时间: 2014-3-10 22:22
首先说:静态肯定是不能调用非静态了,这个没办法,因为编译就不会通过。道理很简单,编译的时候编译器能看到静态,但是看不到非静态,找都找不到怎么调用了,自然会报错。
用非静态调用非静态方法应该有很多,但道理都一样的,就是调用之前是要建立对象的。不建立对象,类中的非静态方法是不存在于内存中的。
像你说的this,指建立本类的对象的那个对象。super指的是父类对象。构造函数也是非静态的,构造函数被调用就代表对象已经建立,当然构造函数所不同的是,它会自动运行。

静态就不一样了,加载类就运行。比如静态代码块,给类进行初始化,有类就有它了,这时候还没有对象呢,你让他调用对象的方法怎么可能。
作者: pifuhanshu    时间: 2014-3-10 23:09
静态方法中不能直接引用非静态变量,需要通过对象来引用,因为静态方法可以直接用类来引用,如果静态方法里面有非静态变量的话,那么就会造成非静态变量没有被实例化就引用了
作者: 水蓝    时间: 2014-3-12 21:46
1、如果被调用的方法它就是非静态的,在不改变方法为静态的情况下静态如何能调用这个非静态呢?
非静态的方法只属于类所实例化的对象。不属于类本身。
举个不恰当的例子吧:
类:就相当于一个冰箱的设计图纸。
对象:就相当于按照类的图纸设计出来的真正的冰箱。

我们可以对冰箱进行开门、关门的方法操作。
但我们不可以对冰箱的设计图纸进行开门、关门的方法操作。
这就是类和对象的区别。

所以呢,要调用冰箱开门、关门的方法,只能new出一个冰箱的实体,才能进行相关的方法操作。

2、说说原理,比如this什么的。
至于this,你可以理解成指向每一个对象(冰箱)的指针。
所以在静态方法中,也就不存在this的概念了。

3、成员不是静态的在不改变成员为静态的前提下该如何调用。
如果成员不是静态的,那只能归各个对象私有。调用的时候,要new出对象,来调用。
(从内存结构上来说,非静态成员,是存储在堆区中的)
如果成员是静态的,那该成员属于类本身,被类相关的各个对象共享。
(从内存结构上来说,静态成员,是存储在方法区中的)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2