static && final

研究问题:

  1. 两者区别与使用范围
  2. static内存图解

要点:

  • final定义一个常量,不能被改变。且定义的方法不能被继承。
  • final static定义一个全局静态常量,不可改变
  • 在静态方法中一定不能调用非静态成员,但在非静态方法中可以调用静态成员Static和finanl区别:
    一、static :
    什么情况下我们要使用static呢?
     1、只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创 建对象。
     2、我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。
    为满足这两方面的要求,可使用static(静态)关键字。
    下面我先举个例子:
    一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。
    为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。
    二、final:
    final可修饰类、域(变量和常量)、方法 (而static不修饰类)
     1、final修饰类,表示该类不可被继承。
     2、final修饰变量
      程序中经常需要定义各种类型的常量,如:3.24268,”201”等等。这时候我们就用final来修饰一个类似于标志符名字。
     3、修饰方法:
      final修饰的方法,称为最终方法。最终方法不可被子类重新定义,即不可被覆盖。
    如父类定义了public void fly(){ ….}
    则子类就不能定义
    public void fly(){。。。。。。}
    但注意覆盖与重载的区别。不能被覆盖并不是不能被重载,如你还可以定义
    public void fly(int i){…..},
  • static内存图解
    这里写图片描述
  • Static
    这里写图片描述
      类中定义了实例变量ia和静态变量sa,并初始化10和20,在主类的主方法中通过StaticAttribute类的对象fun1将ia和sa值改为100,1000;同理,fun2将ia和sa值改为200,2000;由于sa为静态变量,属于整个类,只有有一个对象改变了它的值,所有的对象对应的sa的值都会发生变化,因此fun1、fun2以及StaticAttribute引用的sa得到的值都是2000。
      

  • 这里写图片描述
  • 易错点:没有区分构造方法与静态初始化器在内存中的位置
    构造方法—-方法区
    静态初始化器—-静态初始化器与类构造方法对静态变量sn进行初始化,利用构造方法改变sn的值,再把sn的值给非静态变量n。静态初始化器是在它所属的类加载到内存时由系统调用执行,而构造方法是在系统用new运算符产生新对象时自动执行,每执行一次都要对构造方法进行操作。
    这里写图片描述
  • final
    这里写图片描述
    由于采用不同的初始化形式,fi2值保持不变。而fi1通过构造方法每次递增1。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章