A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘凯旋 中级黑马   /  2014-3-10 13:00  /  1160 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果被调用的方法它就是非静态的,在不改变方法为静态的情况下静态如何能调用这个非静态呢?说说原理,比如this什么的,还有就是成员不是静态的在不改变成员为静态的前提下该如何调用?

评分

参与人数 1黑马币 +2 收起 理由
pifuhanshu + 2

查看全部评分

4 个回复

倒序浏览
在静态方法中调用非静态方法或成员变量的时候,可以通过要调用方法或成员的类的对象来调用,就像main方法中一样。
成员方法和成员变量(私有除外)都可以通过该类的对象调用,无论是在外部还是静态块中。
之所以无法在静态块中直接访问非静态成员,可以理解成静态块要比非静态加载早

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
首先说:静态肯定是不能调用非静态了,这个没办法,因为编译就不会通过。道理很简单,编译的时候编译器能看到静态,但是看不到非静态,找都找不到怎么调用了,自然会报错。
用非静态调用非静态方法应该有很多,但道理都一样的,就是调用之前是要建立对象的。不建立对象,类中的非静态方法是不存在于内存中的。
像你说的this,指建立本类的对象的那个对象。super指的是父类对象。构造函数也是非静态的,构造函数被调用就代表对象已经建立,当然构造函数所不同的是,它会自动运行。

静态就不一样了,加载类就运行。比如静态代码块,给类进行初始化,有类就有它了,这时候还没有对象呢,你让他调用对象的方法怎么可能。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
静态方法中不能直接引用非静态变量,需要通过对象来引用,因为静态方法可以直接用类来引用,如果静态方法里面有非静态变量的话,那么就会造成非静态变量没有被实例化就引用了

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
1、如果被调用的方法它就是非静态的,在不改变方法为静态的情况下静态如何能调用这个非静态呢?
非静态的方法只属于类所实例化的对象。不属于类本身。
举个不恰当的例子吧:
类:就相当于一个冰箱的设计图纸。
对象:就相当于按照类的图纸设计出来的真正的冰箱。

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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马