zoukankan      html  css  js  c++  java
  • 详解 final 和 static

    在我们上一篇博文中提到了 fianl 这个关键字,对于这个关键字,本人在初学时也耗费了极大地心血,甚至和师兄进行了激烈的讨论,并且,在我们讨论、尝试 以及 翻阅各种资料,最终得出了合适、易懂的解释。

    现在,本人来介绍一下final这个关键字:

    final :

    首先,本人来解答一下同学们现在心中可能有的疑惑——为什么会有final呢?

    由于继承中有一个覆盖(方法重写)的现象(相关知识点在本人《详解 方法的覆盖 —— toString() 与 equals()的覆盖》)中进行详细讲解,而有时候我们不想让子类去“覆盖”父类的方法.这对这种情况java就给我们提供了一个关键字: final

    那么,现在本人来介绍下使用这个关键字修饰的特点吧:

    final修饰特点:
    修饰: 被修饰类不能被继承
    修饰方法: 被修饰的方法不能被重写
    修饰变量

    1. 仅在 编译时 被赋初值,并在之后永不改变 的 常量
    2. 在定义这种常量的时候,就必须对其赋值。因为fianl类型的变量,在构造方法时并不会被赋初值,所以我们在定义final类型变量时,要手动给其赋初值,否则会不能进行编译
    3. 对于对象的引用,fianl 关键字使得引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。
      但是,对象本身是可以被修改的,JAVA并没有提供使任何对象恒定不变的途径。
      (这一限制同样适用数组,因为数组也是对象)

    对于“引用”这一概念,可以理解为对象的“指针”,但是是有所差异的,同学们不用着急,在本人之后的博文中会对这个知识点进行使用和讲解。

    而我们在学习SE的阶段一般都是用final来修饰变量,在我们使用final关键字来修饰变量时,它的功能相当于我们在C语言中的“”,主要目的是 避免出现“神仙代码”,使代码逻辑清晰

    那么,现在,本人来介绍一下 static关键字吧。

    static:

    关于这个关键字,我们并不陌生,因为它在这里的 名称 和在C语言中一样,用static关键字修的成员 被称为 静态成员。

    现在,本人来介绍下 static关键字的特点

    1. 随着类的加载而加载
      静态成员 在 JVM对类加载时,就被申请了空间。这也就是说,在一个类还没有被实例化的对象前,就已经申请好了静态成员的空间了;
    2. 被类的所有对象共享
      静态成员不是 “私有财产” ,同一个静态成员在所有该类的对象中是同一个空间;
    3. 静态方法不能引用 非静态成员 和 非静态方法
      但是,非静态方法可以调用静态成员 和 静态方法;
    4. 可以通过类名调用
      静态成员 和 静态方法 一般通过如下方式被调用:
      (1)类名称.静态成员;
      (2)类名称.静态方法();
    5. 静态方法中 不允许出现 this
      这是由于:
      静态是随着类的加载而加载,this是随着对象的创建而存在。
      静态比对象先存在。故我们不能在静态方法中出现this

    那么,有static关键字修饰的变量的特点就讲解完了,现在本人来讲解下 局部变量类的非静态成员类的静态成员 之间的区别吧:

    静态变量和成员变量的区别:

    1. 内存中位置不同
      静态变量 存储于 方法区的静态区
      成员变量 存储于 堆内存
    2. 所属不同
      静态变量 属于 ,所以也称为类变量
      成员变量 属于 对象,所以也称为实例变量(对象变量)
    3. 内存出现时间不同
      静态变量 随着类的加载而加载,随着类的消失而消失
      成员变量 随着对象的创建而存在,随着对象的消失而消失
    4. 调用不同
      静态变量 可以通过类名调用,也可以通过对象调用,推荐使用类名调用
      成员变量 只能通过对象名调用

    在最后的最后,本人来总结一下:

    • final关键字保证的是 该空间的值不可更改,且只能在该类内的方法被调用;
    • static关键字保证的是 该空间的值预先赋值好了,且可以在该项目下任意位置使用
  • 相关阅读:
    appium python api(转)
    make clean 与 make distclean 的区别
    实参相依查找[条款25]----《C++必知必会》
    成员函数查找[条款24]---《C++必知必会》
    C++匿名名字空间
    程序界面多语言切换功能如何实现
    C 语言中 define 的全部使用方法总结
    #if defined(__cplusplus)
    伯乐在线
    jsp手动分页
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12416415.html
Copyright © 2011-2022 走看看