zoukankan      html  css  js  c++  java
  • Java关键字:static

        通常,当创建类时,就是在描述那个类的外观和行为。只有用new创建类的对象时,才分配数据存储空间,方法才能被调用。但往往我们会有下面两种需求:

        1、我想要这样一个存储空间:不管创建多少对象,无论是不创建还是创建无数个,我只在特定区域分配这一个存储空间,大家一起调用,共用资源;

        2、我创建一个方法,不与任何对象有关联,只要需要,其他任何对象都可以调用这个方法,这个方法与它所在的类是否创建没有关系。

        通过static关键字,就可以达到这样的目的。

        java中用static修饰变量或方法,则该变量或方法独立于该类的任何对象。也就是说,被static修饰的变量或方法,不依赖特定的实例,被所有的实例共享。只要类被加载,Java虚拟机就能根据类名在运行时数据区找到他们。static对象可以在它的任何对象创建之前访问,无需引用任何对象。

        static修饰的成员变量或成员方法(静态变量或静态方法),可以直接通过类名来访问:类名.静态方法名(参数)   、类名.静态变量名

        1、static变量

    被static关键字修饰的变量,叫做静态变量;没有被static修饰的变量,叫做实例变量。

    静态变量:在内存中只有一个拷贝,JVM只分配一次内存,在类加载过程中完成静态变量的内存分配。

                  可以用类名直接访问(推荐),也可以通过对象访问(不推荐)。

    实例变量:每创建一个实例,分配一次内存。实例变量可以在内存中有多个拷贝,互不影响。

    注意:

    1、static final :  通常使用static 和final 关键字共同定义一个常量。静态常量在实际生产中使用比较多,比如java.lang.Math中:

    public final class Math {
        /**
         * The {@code double} value that is closer than any other to
         * <i>e</i>, the base of the natural logarithms.
         */
        public static final double E = 2.7182818284590452354;
    
        /**
         * The {@code double} value that is closer than any other to
         * <i>pi</i>, the ratio of the circumference of a circle to its
         * diameter.
         */
        public static final double PI = 3.14159265358979323846;
    }

    2、static定义的变量的值是可变的

        2、静态方法

        静态方法可以通过类名直接调用,任何的实例也都可以调用。因此,静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法,只能访问所属类的静态成员变量和静态成员方法。这是因为实例成员和特定的对象关联,而static的方法独立于任何实例,也正是因为这样,static方法必须被实现,而不能是抽象的(abstract)。

        静态方法的声明:

    1、只能调用其他的static方法

    2、只能访问static数据

    3、不能以任何方式引用this或super关键字

        在下面两种情况下使用静态方法:

    1、一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如:Math.pow)

    2、一个方法只需要访问类的静态域

        说明:

    1、静态方法是类内部的一类特殊方法,只有在需要的时候才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的

    2、静态方法的声明一般是为了方便其他类对该方法的调用

    3、静态方法最常见的实例是:main方法

    public static void main(String[] args) {
    
    }

        3、static代码块

        static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何方法体内,JVM在加载类时会执行这些静态代码块。如果静态代码块有多个,JVM将会按照他们在类中出现的先后顺序依次执行他们,每个代码只会别执行一次。

    静态代码块实例:

    public class HelloB extends HelloA {
        static {
            System.out.println("static B1");
        }
        static {
            System.out.println("static B3");
        }
    
        public static void main(String[] args) {
            new HelloB();
        }
        
        static {
            System.out.println("static B2");
        }
    }
    
    class HelloA {
        static {
            System.out.println("static A1");
        }
        static {
            System.out.println("static A2");
        }
    }

    执行结果:

    static A1
    static A2
    static B1
    static B3
    static B2

    执行结果说明:

    1、继承关系中,实例化子类,会首先实例化父类;

    2、静态代码块会在类加载过程中初始化。

        4、static import   静态导入

        可以在类中 静态导入一个类的静态方法和静态域,语法如下:

    import static java.lang.System.*;

        静态导入之后,就可以直接使用导入类的静态方法和静态域,而不必加类名前缀。

        示例:

    import static java.lang.System.*;
    import static java.lang.Math.*;
    
    public class StaticTest {    
        public static void main(String[] args) {
            /**
             *静态导入后可以直接使用类中的静态方法和静态域,而不必加前缀
             *静态导入示例1:System
             */
            System.out.println("Hello World!");//不使用静态导入
            out.println("Hello World!");//使用静态导入
            /**
             *静态导入示例2:Math
             */
            int x = 3;
            Math.sqrt(Math.pow(x, 2)+Math.pow(x, 2));//不使用静态导入,需要:类名.方法
            sqrt(pow(x, 2)+pow(x, 2));//使用静态导入,直接使用类中的静态方法
        }
    }

    参考资料:

    1.  《Java核心技术 卷1》  4.4 静态域与静态方法 、 4.7.2静态导入

    2.  《Java编程思想》 2.6.3 static关键字 、5.4.2static的含义

    3.  Java static详解

  • 相关阅读:
    例行性工作排程 (crontab)
    数组
    继续我们的学习。这次鸟哥讲的是LVM。。。磁盘管理 最后链接文章没有看
    htop资源管理器
    转:SSL协议详解
    转:SSL 握手协议详解
    转:Connection reset原因分析和解决方案
    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
    转:logback的使用和logback.xml详解
    转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2
  • 原文地址:https://www.cnblogs.com/lashou/p/6072513.html
Copyright © 2011-2022 走看看