zoukankan      html  css  js  c++  java
  • final static 深度解析

      function test(){
    
        var a = b = 10;
    
      }
    
      test( );
    
      alert(b);

    由上一篇博客说起,最后输出的是10。引起歧义的原因是全局变量和局部变量的关系。顺着这个话题,说说java中的这块儿。总--分--总结构来叙述一下。

    参考博客:

      static 详细分析

      实例构造器是不是静态方法

    总:java中没有全局变量这个概念,只有局部变量和成员变量两个说法。

    java中没有“全局变量”的概念。而是有“静态”这个概念。
    1.static 修饰成员变量。
    2.static 修饰成员方法。
    3.static 修饰静态代码块。
    被static修饰的成员变量和成员方法独立于该类的任何对象。即它不依赖于类的实例,被类的所有实例共享。 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以 在它的任何对象之前访问,无需应用任何对象。
    a.

    接下来,对比final。

    Java.lang.String类不可以被继承,由于它被final所修饰。
    1.final 修饰类;
    2.final 修饰方法;
    3.final 修饰变量(成员变量和局部变量)。
    final修饰类,类不能够被继承,String类就是这种情况。final修饰方法,把方法锁定,防止继承它的类来修改它的含义。 final修饰变量,分为修饰基本数据类型变量和应用类型变量。基本数据类型的变量修饰之后不能改值;引用类型的变量初始化 之后不能再指向另外一个对象,但是可以改变当前对象的内容。

    众说纷纭:

    1. (全民财富)在static方法内部不能调用非静态方法,反过来是可以的。

    2. static目的是,方便在没有创建对象的情况下来进行调用(方法/变量)。被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

    3. 对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。

    4. 在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

    5. 在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。

    6. 即使没有显示地声明为static,类的构造器实际上也是静态方法。但是为什么构造方法中?还可以用this来访问成员变量呢??博客

      补充:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

    7. 静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一份儿,它当且仅当在类初次加载时会被初始化,由JVM对它初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多份儿,各个对象拥有的份儿互不影响。

    8. static代码块,用来优化程序的性能。当类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。(只会在类加载的时候执行一次)

    9. 在Java中切记:static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。

    10. Java中的String类就是一个final类。

    11. 当用final修饰一个类时,表明这个类不能被继承。要注意final类中的所有成员方法都会被隐式地指定为final方法。

    12. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

    13. 被final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容是可变的。

    14. 很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份儿,而final的作用是用来保证变量不可变。

    public class Test {
        public static void main(String[] args)  {
            MyClass myClass1 = new MyClass();
            MyClass myClass2 = new MyClass();
            System.out.println(myClass1.i);
            System.out.println(myClass1.j);
            System.out.println(myClass2.i);
            System.out.println(myClass2.j);
     
        }
    }
     
    class MyClass {
        public final double i = Math.random();
        public static double j = Math.random();
    }
      运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道final和static变量的区别了。

    Java基础:

     Java内部类

     HashMap详解  

    算法:

     排序算法汇总

     改进的字符串匹配算法KMP

  • 相关阅读:
    简单验证码生成
    java编译器不匹配问题(java compiler level does not match the version of the installed java project facet)
    jQuery中$.fn
    ThreadLocal是什么?
    xmind 快捷键
    powerdesigner 连接oracle
    vs2019 System.FormatException:“Could not parse the JSON file.”
    svn常见操作
    sqlserve报错处理“数据类型 text 和 varchar 在 equal to 运算符中不兼容”
    数据库随机数据
  • 原文地址:https://www.cnblogs.com/RunForLove/p/4632535.html
Copyright © 2011-2022 走看看