在调用构造方法法中是否能不创建对象调用非静态方法

判断题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢类里面的静态方法是不能访问类的非静态成员的
在类里面的静态方法是不能访问类的非静态成员的,原因很简单,我们要想在本类的方法中访问本类的其它成员,我们需要使用$this这个引用,而$this这个引用指针是代表调用此方法的对象,我们说了静态的方法是不用对象调用的,而是使用类名来访问,所以根本就没有对象存在,也就没有$this这个引用了,没有了$this这个引用就不能访问类里面的非静态成员,又因为类里面的静态成员是可以不用对象来访问的,所以类里面的静态方法只能访问类的静态的属性,既然$this不存在,在静态方法中访其它静态成员我们使用的是一个特殊的类“self”;self和$this相似,只不过self是代表这个静态方法所在的类。所以在静态方法里,可以使用这个方法所在的类的“类名”,也可以使用“self”来访问其它静态成员,如果没有特殊情况的话,我们通常使用后者,即“self::成员属性”的方式。
在非静态方法里可不可以访问静态成员呢,当然也是可以的了,但是也不能使用“$this”引用也要使用类名或是“self::成员属性的形式”。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。深入this关键字(静态方法中不能调用非静态成员的解释)
深入this关键字(静态方法中不能调用非静态成员的解释)
在本文的开头,非常感谢Thining in JAVA这本书给我的启发,大师就是大师,正是因为有了你们这些大师对基础的极致追求,我们这些菜鸟才少走了很多弯路,BY THE WAY:
陈昊鹏翻译的那个有点撒?希望我有一天能翻译这本书!!!嘻嘻^-^
this的常见用法:1.在构造器中,显示写出this.成员,区分成员变量与局部变量;
2.在构造器中,用this(实参列表),调用其他的一个构造器,相信大家都懂,不惹人烦啦^-^
this的深入:1.在每一个非静态方法的内部,都有一个this,相当于一个句柄,由编译器隐示添加。method(参数列表)可以看成是method(类名&this,参数列表),在面向对象中,成员属性必须由对象调用,所以在方法内部,每一个成员其实都有一个this.”前缀,当对象调用这个方法的时候,编译器会把该对象传递给方法(也就是常说的“this指向调用该方法的当前对象”),编译器会将其编译为method(对象,实参列表)。
&&&&&2.在一个静态方法内部,由于静态方法是属于类的,被每个类的实例所共享,所以没有this句柄,当然就不能在静态方法中访问非静态的成员(属性和方法),而具体在编译器会怎么看愣,编译器会说哪个对象调用了成员,他妈的我都找不到这个对象,然后它就会大吼一句“还有谁!!!”,最后报错。
静态方法中不能调用非静态成员的解释:在前期我也曾为找这个问题的原因看了很多的贴,发现解释都经不起推敲,比如说生命周期的不同,甚至有的还扯到了内存。我不知道为什么他们会扯到内存,因为那个报错是编译器给我们报的,不是JAVA虚拟机启动后给我们报的,编译时根本不会扯到内存,因为JAVA程序的OS都还没启动愣,怎么分配内存?其实原因就是上面讲到的this。
很容易验证:
public&class&Test&{
private&int&i=2;
public&void&show(){
System.out.println(i);//编译器没有报错
System.out.println(this.i);//编译器没有报错
System.out.println(new&Test().i);//编译器没有报错
public&static&void&invoke(){
//System.out.println(i);//报错:Cannot&make&a&static&reference&to&the&non-static&field&i
//show();//报错:Cannot&make&a&static&reference&to&
//the&non-static&method&show()&from&the&type&Test
//this.show();//报错:Cannot&use&this&in&a&static&context,因为是类成员,没有this句柄
new&Test().show();//OK,指定对象,符合面向对象的思想,即非静态成员从属于某个对象(这个用生命周期就解释不通)。
我的热门文章
即使是一小步也想与你分享6769人阅读
我们都知道,静态static方法中不能调用非静态(non-static)方法,准确地说是不能直接调用non-static方法。但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-static方法。
&&&&& 其实这个事实的应用很经常,以至于我们不去重视:在主函数(static方法)中我们经常创建某个类的实例,再利用其引用变量调用它的非静态方法。class Test2{
public void method2(){
System.out.println(&HelloWorld2&);
class test{
public void method0(){
System.out.println(&HelloWorld0&);
public static void method1(){
System.out.println(&HelloWorld1&);
public static void main(String args[]){
new test().method0();
method1();
new Test2().method2();
HelloWorld0
HelloWorld1
HelloWorld2
& & & 首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在创建对象的时候,即new 操作的时候才初始化的;
&&&&&&& 先后顺序是先加载,才能初始化,那么加载的时候初始化static的成员,此时非static的成员还没有被加载必然不能使用,而非static的成员是在类加载之后,通过new操作符创建对象的时候初始化,此时static 已经分配内存空间,所以可以访问!
&&&& &简单点说:静态成员属于类,不需要生成对象就存在了.而非静态需要生成对象才产生.所以静态成员不能直接访问非静态.&&
下面说说静态的特点:
1.随着类的加载而加载
也就是,说静态会随着类的消失而消失,说明静态的生命周期最长
2.优先于对象的存在
明确一点:静态是先存在的对象是后存在的
3.被所有对象共享
4.可以直接被类名多调用
实例变量和类变量的区别
1.存放位置
类变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存里
2.生命周期
类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失,实例变量随着“对象”的消失而消失
静态的使用注意事项:
1.静态方法只能访问静态成员(包括成员变量和成员方法)
&& 非静态方法可以访问静态也可以访问非静态
2.静态方法中不可以定义this,super关键字
&& 因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字
3.主函数是静态的。
静态的利弊
&& 利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份
&& &&可以直接被类名所调用
&& 弊:生命周期过长,访问出现局限性(只能访问静态)
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:47995次
积分:1054
积分:1054
排名:千里之外
原创:58篇
(2)(3)(1)(6)(23)(29)问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
有一个很常见的代码:System.out.println,这是再常见不过的输出语句,但是学了一段时间突然想起去看了下源码,下面是源码:
public final static PrintStream out =
out是在System类下定义的,还没实例化,out仅仅是一个null的变量,甚至都不能称之为静态对象,但是却能调用PrintStream类下的println()方法,这就不太理解了?请问为什么?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
额, 在initializeSystemClass()这个函数里面做的初始化工作, 这个函数是在系统线程初始化后调用的, 也就是说, 所有的静态成员变量(err out in)都是在这函数里面初始化了的, 例如说这个out : FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));而setOut0()函数是在native层,在native层把初始化的对象和这个out建立起连接
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
详细解释:中文版英文版基于jdk7
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App}

我要回帖

更多关于 调用父类的构造方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信