static方法不能直接访问类内的非static变量和不能调用this,super语句分析
大家都知道在static方法中,不能访问类内非static成员变量和方法。可是原因是什么呢?
这首先要从static方法的特性说起。static方法,即类的静态成员经常被称为“成员变量”(class members),对于静态成员变量,我们叫类属性(class attributes),对于静态成员方法,我们叫类方法(class members)。其中静态成员变量:无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。我们可以直接使用类名来访问这个static变量,还可以在类的非静态的成员方法中像访问其他非静态成员变量一样去访问这个静态成员变量。对于静态方法,该方法不必和对象绑在一起。访问方式有三种,类内:非静态成员方法可以直接访问静态成员方法,类外:类名.成员 对象.成员
从以上我们就可以知道,静态成员的最大特点是不用和对象绑定在一起。这个方便的特性,也成了它的一个包袱:当在静态成员的类外时,如果是直接用类名.静态成员的方式访问,静态成员直接访问了一个非静态的成员(该被访问成员一般是类内的,如果是类外的,可能就先创建对象了,因为不能直接访问,这里的直接访问与访问权限没有概念上的关系,访问权限是设定了访问的范围,直接访问则是一种访问方式)。这个时候就出现一个问题,非静态的成员是怎么访问的?如果可以直接访问,难道它也是可以脱离对象的吗?(静态成员的访问是脱离了对象的,而静态成员又直接访问了非静态成员)答案显然是否定的。所以在静态方法中不可以直接访问类内的非静态成员,如果要访问非静态成员,则要先创建对象。
也许会有这样的疑问:既然是出在了非静态成员身上,那么可不可以用对象.static方法直接访问类内的成员?这个样子的实质还是直接访问了非静态成员,并不是说用了对象.static方法访问就可以改变静态方法访问类内成员的方式.
简而言之:
1.Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。而this指代的是当前的对象2.在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况. 3.而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!
static方法不能直接访问类内的非static变量和不能调用this,super语句分析的更多相关文章
- 【转】forbids in-class initialization of non-const static member不能在类内初始化非const static成员
转自:forbids in-class initialization of non-const static member不能在类内初始化非const static成员 今天写程序,出现一个新错误,好 ...
- 小鱼提问3 static方法中可以访问某个类的私有变量吗(不通过反射的其他非正常手段)?什么情况下可以?
class Student { private string _name; public int Age = 0; public static void Test() { Student stu = ...
- 类里面的非static const成员
类里面的成员变量可以用const修饰,在只用const不用static修饰的情况下,这种使用的限制比较多 (1)不能定义处初始化,必须在类的构造函数初始化列表里面初始化(虽然在vs中,可以在定义处初始 ...
- 在java类中,是先执行类的构造函数还是先执行类的私有非静态变量
举例子: package test_instance; public class TestClassLoaderTime { public TestClassLoaderTime(){ System. ...
- C++11类内static成员变量声明与定义
众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...
- JVM学习03_new对象的内存图讲解,以及引出static方法(转)
目录 -=-讲解对象创建过程中,-=-堆内存和栈内存的情况 -=-构造函数对类对象的成员变量的初始化过程 -=-构造函数出栈 -=-类的方法在不访问类对象的成员变量时造成的内存资源浪费怎么解决? -= ...
- java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包
Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...
- OC-私有方法,构造方法,类的本质及启动过程
总结 标号 主题 内容 一 OC的私有方法 私有变量/私有方法 二 @property 概念/基本使用/寻找方法的过程/查找顺序 三 @synthesize @synthesize概念/基本使用/注意 ...
- interface中定义default方法和static方法
interface的default方法和static方法 接口中可以定义static方法,可通过接口名称.方法名()调用,实现类不能继承static方法: 接口中可以定义default方法,defau ...
随机推荐
- Apache 日志分析(二)
01.查看IP cat access_log | awk ‘{print $1}’ 02.对IP排序 cat access_log | awk ‘{print $1}’ | sort 03.打 ...
- Unhandled Error in Silverlight Application “Syncfusion.Silverlight.Olap.Gauge.OlapGauge”的类型初始值设定项引发异常
Silverlight 在运行时,如果出现如下错误: 检查生成的xap文件,解压出来,看是否里面包含该DLL:Syncfusion.Silverlight.Olap.Gauge.OlapGauge
- Markdown Test
P1 1.1 interview 1.2 invoker show 1.3 Wtf? P2 for example this is a story int main() { printf(" ...
- 10 Best TV Series Based On Hacking And Technology
Technology is rapidly becoming the key point in human lives. Here we have discussed top TV shows whi ...
- SubLime3 Emmet插件终极教程
当我们在手写HTML.CSS等 页面的时候,这款神级插件是不可多得的神器 1.官方示例:http://docs.emmet.io/cheat-sheet/ 2.第三方示例:http://www.w3c ...
- Document.getElementById 与 $('#id')的区别
一直认为jquery中的$("#id")和document.getElementByIdx_x("id")得到的效果是一样的,今天才发现并不是这么一回事,通过测 ...
- Debian下配置SSH服务器的方法
Debian 503版本中实现的,Debian默认好像是没有ssh支持的. SSH的安装apt-get install openssh-serverapt-get install sshSSH的配置O ...
- 10款让你心动的 HTML5 & CSS3 效果
这里集合的这组 HTML5 & CSS3 效果,有的是网站开发中常用的.实用的功能,有的是先进的 Web 技术的应用演示.不管哪一种,这些案例中的技术都值得我们去探究和学习. 1.超炫的 HT ...
- Change http port in bitnami stack
My case goes like this. I installed bitnami redmine first with port 80 for http service, but got pro ...
- Codevs 3231 小吃
时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 这里简直是吃货的天堂,小吃太多了.数不胜数. 假设岛上有N种小吃,每种体积Vi, ...