`
bingzhen66
  • 浏览: 36194 次
文章分类
社区版块
存档分类
最新评论

13.黑马程序员-static关键字、静态代码块

 
阅读更多

------- android培训java培训、期待与您交流! ----------

1.static(静态)关键字
  • 作用:用于修饰成员(成员变量和成员方法)。
  • 被修饰后成员的特点:
    • 随着类的加载而加载。
    • 优先于对象存在
    • 被所有对象所共享。
    • 可以直接被类名调用:类名.静态成员。
  • 使用注意
    • 静态方法只能访问静态成员。
    • 静态方法中不可以写this,super关键字。
    • 主函数是静态的。
    • 静态的好处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象都存储一份。。可以直接用类名调用。
    • 静态的弊端:生命周期过长,访问出现局限性。
  • 什么时候使用静态?
    • 要从两方面下手
      • 因为静态修饰的内容有成员变量和函数。
      • 什么时候定义静态变量(类变量)呢?
      • 当对象中出现共享数据时,共享数据不是指成员变量相同,而是变量的值相同。对象中的特有数据要定义成非静态存在于堆内存中。
      • 什么时候定义静态函数呢?
      • 当功能内部没有访问到非静态数据(对象的特有数据)。那么该功能可以定义成静态的。
  • 方法区
    • 静态方法存在于方法区
    • 也叫做:共享区,数据区。
    • 方法区还有一些更细节的划分
    • 存在:类中的方法,类中的共享数据,
      • 方法是类的共性方法,对象的特有数据是每个对象都不同的。
      • 方法区的数据(类变量,也就是静态变量)随着类的建立而建立,随着类的消失而消失。而实例变量随着对象的建立而存在于对内存中,随着对象的消失而消失。
  • 静态的应用
    • 当多个应用程序的功能重复时,可以把方法提取出来,建立一个Tool类。
    • 虽然可以通过建立arrayTool的对象使用这些工具方法,对数组进行操作,但是发现了问题
      • 对象是用于封装数据的,开始arrayTool对象中并未纷杂U那个特有数据。
      • 操作数组的每一个方法都没有用到arrayTool对象中的特有数据。
      • 这时就考虑,让程序更严谨,是不需要对象的。
      • 可以将arrayTool中的方法都定义成static的。直接通过类名调用即可。可以将构造函数私有防止被建立对象。
2.静态代码块
  • 静态代码块的格式:
    • static
    • {
      • 静态代码块中的执行语句。
    • }
  • 特点:随着类的家在而执行,只执行一次。
  • 作用:给类初始化,并且不需要调用,不论位置前后都优先于mian函数。
  • 用到类中的内容的时候,类才会初始化,new 类(使用了构造方法)或类名.方法都是。值定义引用是不会加载类的,例如类 类名=null就不加载。
  • 静态代码块的考试
  • 静态代码块、构造代码块、构造函数一起出现,前者随着类初始化,后者随着对象初始化。疑问?静态代码块和构造代码块次序不同时,是按代码顺序初始化呢还是先初始化类在初始化对象这种方式。
  • 对象的初始化过程。
    • 创建对象时,new在内存中做了什么事情。
    • person p =new person();
    • new对象的时候会将person这个class从硬盘当中通过jvm加载进内存,开辟了堆内存空间。这时候栈内存中,主函数里有个p引用。
    • 静态代码块被执行。
    • 对象空间开辟,成员变量进入内存,默认初始化,例如int初始化为0,字符串初始化为null。然后是显示初始化,成员变量开始赋值。
    • 接下来构造代码块初始化,再后构造函数初始化。
    • 将内存地址付给栈内存中的p变量。
  • 对象调用成员过程
    • person p = new person("zhangsan",20);
    • p.setName(“lisi”);
    • 方法区优先于对象存在,静态方法、静态变量先初始化。
    • 栈里面main先执行,有一个引用变量p,堆里面有一个 person对象,对象默认初始化后再显示初始化,然后p指向对象。
    • 对象成员(方法、变量)加载进方法区。
    • 对象方法中如果含有局部变量参数,那么这个方法也要进入栈中开辟空间。方法一开辟空间内部就有个this的引用,谁调用这个方法,this就是堆中的这个对象,然后栈中的方法的局部变量修改堆中的成员变量。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics