• java基础知识--final和static关键字


    final和static关键字

    1、final关键字

      1、含义

          final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,

        编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

       2、final类(final修饰类)

          被final修饰的类,是不可以被继承的,这样做的目的可以保证该类不被修改,Java的一些核心的API都是final类,例如String、Integer、Math等

          

      3、final方法(final修饰方法)

          final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写

          如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。

          

      final方法的原因有二:
            第一、把方法锁定,防止任何继承类修改它的意义和实现。
            第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

    4、final修饰实例变量(类的属性,定义在类内,但是在类内的方法之外)

          final修饰实例变量时必须初始化,且不可再修改;

          示例:

          

          

            final修饰实例变量时必须初始化,且不可再修改代码。

       5、final修饰局部变量(方法体内的变量)

          final修饰局部变量时只能初始化(赋值)一次,但也可以不初始化

          

          

       6、final修饰方法参数

          final修饰方法参数时,是在调用方法传递参数时候初始化的

          

        7、final关键字的好处       

      1. final关键字提高了性能。JVM和Java应用都会缓存final变量。
      2. final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
      3. 使用final关键字,JVM会对方法、变量及类进行优化。

        8、final关键字知识点总结      

        1. final关键字可以用于成员变量、本地变量、方法以及类。
        2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
        3. 你不能够对final变量再次赋值。
        4. 本地变量必须在声明时赋值。
        5. 在匿名类中所有变量都必须是final变量。
        6. final方法不能被重写。
        7. final类不能被继承。
        8. final关键字不同于finally关键字,后者用于异常处理。
        9. final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
        10. 接口中声明的所有变量本身是final的。
        11. final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
        12. final方法在编译阶段绑定,称为静态绑定(static binding)。
        13. 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
        14. 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
        15. 按照Java代码惯例,final变量就是常量,而且通常常量名要大写:

     

        private final int COUNT = 10;

     

         16.对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。譬如:   

    private final List Loans = new ArrayList();
    list.add(“home loan”);  //valid
    list.add("personal loan"); //valid
    loans = new Vector();  //not valid

     

        

    2、static关键字

      1、概念

           static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

          被static修饰的成员变量和成员方法独立于该类的任何对象,也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类

        名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

        用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。

         static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。    

         static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
          类名.静态方法名(参数列表...) 
          类名.静态变量名
              用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块;
     

      2、修饰成员变量

        static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员:   

        Java类提供了两种类型的变量:

          用static关键字修饰的静态变量和不用static关键字修饰的实例变量。静态变量属于类,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间,

        因此就可以被使用了。对静态变量的引用有两种方式,分别是“类.静态变量"和”对象.静态变量"

        实例变量属于对象,只有对象被创建后,实例变量才会被分配内存空间,才能被使用,它在内存中存在多个复制,只有用“对象.实例变量”的方式来引用。

      3、static成员方法     

          Java中提供了static方法和非static方法。static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用

          static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没被

        创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。

     1 public class PrintHelper {
     2 
     3     public static void print(Object o){
     4         System.out.println(o);
     5     }
     6     
     7     public static void main(String[] args) {
     8         PrintHelper.print("Hello world");
     9     }
    10 }

      4、static代码块

        static代码块在类中是独立于成员变量和成员函数的代码块的。注意:这些static代码块只会被执行一次  

     1 class Book{
     2     public Book(String msg) {
     3         System.out.println(msg);
     4     }
     5 }
     6 
     7 public class Person {
     8 
     9     Book book1 = new Book("book1成员变量初始化");
    10     static Book book2;
    11     
    12     static {
    13         book2 = new Book("static成员book2成员变量初始化");
    14         book4 = new Book("static成员book4成员变量初始化");
    15     }
    16     
    17     public Person(String msg) {
    18         System.out.println(msg);
    19     }
    20     
    21     Book book3 = new Book("book3成员变量初始化");
    22     static Book book4;
    23     
    24     public static void funStatic() {
    25         System.out.println("static修饰的funStatic方法");
    26     }
    27     
    28     public static void main(String[] args) {
    29         Person.funStatic();
    30         System.out.println("****************");
    31         Person p1 = new Person("p1初始化");
    32     }
    33     /**Output
    34      * static成员book2成员变量初始化
    35      * static成员book4成员变量初始化
    36      * static修饰的funStatic方法
    37      * ***************
    38      * book1成员变量初始化
    39      * book3成员变量初始化
    40      * p1初始化
    41      *///~

      5、静态导包   

    1 /* PrintHelper.java文件 */
    2 package com.dotgua.study;
    3 
    4 public class PrintHelper {
    5 
    6     public static void print(Object o){
    7         System.out.println(o);
    8     }
    9 }
     1 /* App.java文件 */
     2 
     3 import static com.dotgua.study.PrintHelper.*;
     4 
     5 public class App 
     6 {
     7     public static void main( String[] args )
     8     {
     9         print("Hello World!");
    10     }
    11     /**Output
    12      * Hello World!
    13      *///~
    14 }

        上面的代码来自于两个java文件,其中的PrintHelper很简单,包含了一个用于打印的static方法。而在App.java文件中,我们首先将PrintHelper类导入,这里在导入时,我们使用了static关键字,而且在引入类的最后还加上了“.*”,它的作用就是将PrintHelper类中的所有类方法直接导入。不同于非static导入,采用static导入包后,在不与当前类的方法名冲突的情况下,无需使用“类名.方法名”的方法去调用类方法了,直接可以采用"方法名"去调用类方法,就好像是该类自己的方法一样使用即可。

       6、总结       

    static是java中非常重要的一个关键字,而且它的用法也很丰富,主要有四种用法:

      1. 用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
      2. 用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
      3. 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
      4. 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。

     

      

    3、static与final结合使用表示的意思:   

    对于变量,若使用static  final修饰,表示一旦赋值不能修改,并且通过类名可以访问。
    对于方法,若使用static final修饰,表示该方法不可被覆盖,并且可以通过类名直接访问。
     
     
     
    参考博客:
      http://www.importnew.com/7553.html
      http://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral
      http://blog.csdn.net/jsqfengbao/article/details/44724219
      http://lavasoft.blog.51cto.com/62575/18771/

          

    千里路我只陪你一程,从此艳阳风雪我不问!
  • 相关阅读:
    CS231n assignment3 Q1 Image Captioning with Vanilla RNNs
    使用tensorflow预测函数的参数值(a simple task)
    CS231n assignment2 Q5 TensorFlow on CIFAR-10
    CS231n assignment2 Q4 Convolutional Networks
    HDU 1561 The more, The Better
    HDU4003 Find Metal Mineral
    poj 1947 Rebuilding Roads
    2090 背包
    poj 2408 Apple Tree
    奔跑的xiaodao
  • 原文地址:https://www.cnblogs.com/huststl/p/7601694.html
Copyright © 2020-2023  润新知