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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


Static关键字介绍:

创建对象就是为了产生实例,并进行数据的封装,而调用功能时,却没有用到这些对象中封装的数据(成员变量),很多无用的对象聚集在堆内存中并不调用,这样堆内存的空间就会严重浪费。



所以,不建议创建对象。java中的解决方案就是,使用静态关键字static。这是一个成员修饰符。
被静态static修饰的方法,除了可以被对象调用外,还可以被类名调用。

总结:类的静态方法为什么不能调用非静态方法(或属性)呢?
         程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:而非静态成员,创建类的实例时分配内存,类的不同实例对应不同的内存区域
总结:
什么时候需要将方法定义成为静态?
         定义功能时,如果功能不需要访问类中定义的成员变量(非静态变量)时候,该功能就需要静态修饰。
注意:静态方法在内存中,不会创建实例化对象。只是在栈中直接简单调用即可完成方法的调用。
静态方法的参数也是作为局部变量存在,参与取值赋值等操作。这一点和非静态方法是一样的。

注意:静态static是成员修饰符,只能修饰成员。
定义一个圆类:
这样定义的话,成员变量pi是不变的值,每次实例化都会在堆内存中存储一份,这样有点浪费内存空间。
解决方法就是:
实现对象的共享,加入静态关键字:static修饰。
Circle.pi 中类名Circle.可以省略(因为是在本类中调用)。
什么时候定义静态变量:
         当该成员变量的值,每一个对象都一致时,就对该成员变量进行静态修饰。

静态变量和成员变量的区别
静态变量和成员变量的区别
1.所属的范围不同,静态变量所属于类,成员变量所属于对象。静态变量也称为:类变量。成员变量也成为实例变量(对象变量)。
2.调用不同,静态变量可以被对象和类调用(一般都用类名调用),成员变量只能被对象调用。
3.加载时期不同,静态变量随着类的加载而加载,成员变量随着对象的加载而加载。
4.内存存储区域不同。静态变量存储在方法区中,成员变量存储在堆内存中。
【问题】常量存储在哪里。

静态代码块
需求:类一加载,就做一些动作,不一定需要对象。
注意:静态,是随着类的加载而加载的。
学习目标:必须了解加载的顺序。
静态代码块:
         特点:随着类的加载而执行,而且仅执行一次。
         作用:给类进行初始化。
再一个例子:
静态变量有两次初始化,一次是默认初始化,一次是显示初始化。
因为输出窗口显示的是9而不是0,所以可知:
静态代码块,在静态变量显示初始化以后再执行。
(这样做其实是有道理的,因为没有初始化的变量拿来使用是没有什么意义的。)
注意:静态代码块位于静态方法区。


构造代码块&局部代码块
构造代码块,只要创建对象,就会被调用,给所有对象初始化。不同于构造函数,构造函数只给对应的对象针对性地初始化。
利用构造代码块,可以定义不同构造函数的共性代码。(如果没有自定义构造函数,对默认的构造函数依然有效。)
例子:
例子2
成员变量有两次初始化:1默认初始化,2.显示初始化。
通过上述例子,可以得出,
构造代码块的执行在成员变量显示初始化后执行。
注意:在执行顺序上,静态优先于对象。


局部代码块
局部代码块的作用是:可以控制变量的生命周期。
这样缩短了变量的生命周期,会更节省内存,内存的利用效率会更高。
   


5 个回复

倒序浏览
谢谢分享.....
回复 使用道具 举报
自己会总结是学习最有效的方法
回复 使用道具 举报
不错不错,干货,
回复 使用道具 举报
1178988315 来自手机 中级黑马 2016-1-19 01:24:19
报纸
不错,加油!!!
回复 使用道具 举报
给力给力!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马