`

Java static 的一两点使用

    博客分类:
  • java
 
阅读更多
Java static 的一两点使用
这篇文章是关于Java static关键字的使用,主要会介绍以下的内容:

static 的概念
static的各种应用
总结
static 是什么
static 顾名思义是静态的意思。与this相对,static表示所修饰的部分是属于类本身所有的,不依赖与某个具体的实例。 而this上个博客已经讲了,可参考this的使用.this表示的是对调用方法的那个当前对象的引用,可以看做是类的实例的引用,依赖于具体的实例。所以这也就是《Java编程思想》里面说的

 “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”

在了解他使用之前,我们先思考一下,为什么我们需要使用staitc,一切都通过对象去调用不也可以吗?
这样做是可以,对象是可以调用实例变量,实例方法,类方法,类成员变量。但是这样真的好吗?我们有一些东西是不依赖具体对象。比如我们有一些工具类,如Math,里面的cos,sin这些都是客观存在,不会改变的。任何一个对象都不影响Math里面的任何东西,相反,像我们定义一个圆这个类,那么圆的半径,圆的面积显然是不同的圆 是不同的 这就不能用static。
好了,我们已经知道了static是什么,以及该什么时候去使用它,那我们我们都可以怎么用它呢?

static的用法
static 变量
static 方法
static 代码块
static 变量
static变量就是静态的成员变量,所谓静态变量就是静态变量是归类本身所有,被所有对象所共享,在内存中只有一个副本。而非静态的就是每个对象所有,在内存中有多个副本,每个对象的副本互不影响。
比如我们常常自己定义或者是看源码中有很多常量,这些常量就是用final static修饰的。用static来修饰,让这个常量不需要new一个对象就能得到,非常的方便。例子如下:

/**
* Created by byhieg on 2016/6/20.
*/
public class CityFragment extends Fragment {
    public static final String TAG = "CityFragment";
    //省略其他代码
}
这样,我们就可以直接通过CityFragment.TAG来得到TAG。

static 方法
static 方法和static 变量的使用目的是一致的,一般用来不通过创建对象来使用方法,用来做工具类的方法。如我们可以把处理字符串的操作的方法统一放到一个固定类里面,我们调用的时候,只需要通过类名.方法名就可以,省去每次创建对象浪费的内存。比如下面的例子

/**
* Created by byhieg on 2016/6/20.
*/
public class StringUtils {
    //根据输入的指定的字符,分割字符串
    public static String[] splitString(String str,String regex) {
        String [] result = str.split(regex);
        return result;
    }

    //删除指定位置的字符串
    public static String delPosOfString(String str, int[] pos) {
        StringBuffer sb = new StringBuffer(str);
        for(int i = 0 ; i < pos.length;i++) {
            sb.deleteCharAt(pos[i]);
        }
        return sb.toString();
    }
}
我们可以直接这么调用StringUntils.splitString(args1,args2)
下面,我们说一些用static 方法的注意事项。我们看一下下面的例子。

/**
* Created by byhieg on 2016/6/20.
*/
public class Main {
    public static final String str = "byhieg";
    public String error = "error";

    public void test() {
        System.out.println(str);
        System.out.println(error);
    }

    public static void main(String[] args) {
        System.out.println(test());
        System.out.println(error);
        System.out.println(str);
    }
}
运行会出现下面的错误

Error:(13, 28) java: 无法从静态上下文中引用非静态 方法 test()
Error:(14, 28) java: 无法从静态上下文中引用非静态 变量 error
虽然我们举例用的Main方法,但他是static方法,使用的是统一的static语法规则。报错的原因是因为在静态方法中我们是无法调用非静态的成员变量和方法。因为非静态的方法和变量是依赖于对象创建,对象才能调用的。所以是不可以调用的。但是在非静态方法中,是可以调用全部,因为上文说了 静态的是归所有对象共享,非静态是省略了this才调用成功的。

/**
* Created by byhieg on 2016/6/20.
*/
public class Main {
    public static final String str = "byhieg";
    public String error = "error";

    public void test() {
        System.out.println(str);
        System.out.println(error);
        //此处省略了this 实际应该是this.test1(),this.error
        //所以也是通过对象对调用的非静态的变量和方法
        test1();
    }


    public void test1() {
        System.out.println(str);
        System.out.println(error);
    }
    public static void main(String[] args) {
        new Main().test();
    }
}
static 初始化块
在说明静态初始化块的时候,我们先了解一下什么是初始化块。当我们需要生成很多对象的时候,每次都需要执行构造方法,如果我们的构造方法中,有一些代码是不依赖参数的,我们就可以把这些代码提取出来,放到同一个地方。这个地方我们称之为初始化块。
初始化块允许定义很多个,执行顺序与书写的顺序有关,但实际没什么卵用,因为他是创建Java对象时隐式执行,且全部被执行,完全可以把他们放到一起去执行。初始化块的执行会先于构造器,这点很重要。
接下来,我们看一下static静态块,static静态块除了有静态块的优点以外,他还有static所带来的优点,即他在类初次被加载时执行,且只会执行一次。不会像普通代码块一样,每次对象创建时都会执行,这样我们可以把一些造成空间浪费的语句,放到静态初始化块中执行。比如下面的代码

/**
* Created by byhieg on 2016/6/20.
*/
public class Main {
   
    public Main() {
        Integer a = new Integer(1024);
        //省略其他初始化代码
       
    }
}
每次在new一个新对象的时候,都会创建一个新的Integer对象。这样无疑浪费空间,这时我们就需要用静态代码块,把Integer a放进去,就可以保证只会初始化一次。如下:

/**
* Created by byhieg on 2016/6/20.
*/
public class Main {
    public static Integer a;
   
    static {
        a = new Integer(1024);
    }

    public Main() {
        //省略构造器其他代码
    }
}
静态初始化块执行的顺序在普通初始化块执行之前,因为只有类被加载并初始化之后,我们才能创建类的的实例,但以后再创建的实例的时候就不会再执行静态初始化块了。

总结
static 是与类相关的一个关键字,所修饰的部分表明该部分是归类所有。比如static修饰变量就表明该变量是静态变量,被所有对象所共享,被类所拥有。static修饰方法,与变量时一致的,只是在静态方法中是不允许调用非静态的变量和方法。而静态代码块是比较特殊的存在,用来初始化一些共有的东西,在类被加载时只执行一次。
分享到:
评论

相关推荐

    java中static作用

    static 是 Java 语言中一个关键字,表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态代码块。在 Java 语言中,没有全局变量的概念,但是可以使用 static 来实现类似于全局变量的效果。 ...

    Java static修饰方法

    正确理解和使用`static`关键字是成为一名熟练的Java程序员的关键。理解其工作原理并根据需要恰当地在代码中应用,可以提高程序的效率和可维护性。在实际编程过程中,我们应该根据需求平衡使用静态和非静态方法,以...

    java中static属性学习

    当创建了两个`StaticTest`类的实例时,`st1`和`st2`都指向同一个`i`变量。 ```java StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest(); ``` 此时,无论是通过`st1.i`还是`st2.i`访问这个变量...

    Java关键字final、static使用总结

    在 Java 编程语言中,final 和 static 是两个非常重要的关键字,它们可以用来修饰类、方法、变量等,了解它们的使用方法和限制非常重要。本文将详细总结 final 和 static 的使用方法和限制。 一、final 关键字 ...

    java中final和static的区别

    4. 用 private 修饰的 static 成员变量和成员方法,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很...

    Java static修饰成员变量

    Java中的`static`关键字是编程中的一个重要概念,它在Java语言中扮演着多个角色,尤其在处理类和对象时起到关键作用。`static`关键字可以用来修饰成员变量、方法、代码块以及内部类,每种情况都有其特定的含义和用途...

    java中final关键字和static关键字详细用法

    Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...

    【Java基础】Java8新特性—接口中使用default和static关键字

    Java 1.8对接口有两个方面的增强:接口中可以添加使用default或者static修饰的方法 增加default方法:又叫做接口扩展方法,即在不破坏java现有实现架构的情况下能往接口里增加新方法, default关键字可以给接口添加...

    java中final和static的总结

    在Java编程语言中,`final` 和 `static` 是两个非常重要的关键字,它们分别具有不同的含义和用法,但都对代码的结构和行为产生深远影响。本文将深入探讨这两个关键字,并结合实际示例来解释它们的应用场景。 首先,...

    Duanxx的Java学习:关键字Static详解

    关键字Static就是为了满足上面提到的两种...当某一个变量或方法被声明为Static的时候,这个变量或方法就不再和任何一个类的实例对象绑定,即便没有创建任何一个实例对象,也可以方位Static的变量或者调用Static的方法

    final和static用法详解JAVA

    Java 中的 final 和 static 关键字详解 final 关键字是 Java 中的一种访问...final 和 static 关键字是 Java 中两个重要的访问修饰符,它们可以帮助开发者更好地设计和实现类、方法和变量,提高程序的效率和可维护性。

    final关键字和static_用法

    `static`关键字在Java中主要用于创建静态成员,包括静态变量和静态方法。与普通成员不同,静态成员属于类级别,而不是实例级别。这意味着无论创建了多少个类的实例,静态成员只有一个副本存在于内存中。 #### 二、...

    java中final与static的用法

    在Java编程语言中,`final`与`static`是两个非常关键且常用的关键字,它们各自具有独特的功能和用途,可以极大地增强代码的稳定性和可维护性。下面将详细解析这两个关键字的用法及其在Java中的重要性。 ### 一、`...

    JAVAStatic静态变量.doc

    Java中的`static`关键字是用来声明静态变量或静态方法的,它是面向对象编程中非常关键的一个概念。静态变量属于类,而不是类的实例,这意味着它们在内存中只有一份拷贝,所有的类实例共享这个相同的变量。当我们声明...

    java 球面两点距离 java球面两点距离

    在Java编程中,计算球面上两点之间的距离是一个常见的地理计算问题,特别是在处理GPS坐标或者其他涉及地理位置的应用中。这个任务通常涉及到地球的经纬度坐标系统,因为这是全球定位系统(GPS)所采用的标准坐标体系...

    java static块和构造函数的实例详解

    Java static 块和构造函数是 Java 编程语言中两个非常重要的概念,它们在 Java 程序的执行过程中扮演着重要的角色。今天,我们将深入探讨 Java static 块和构造函数的实例详解,帮助大家更好地理解和掌握 Java 编程...

    浅谈Java中static关键字的作用

    Java 中 static 关键字的作用 Java 中的 static 关键字是一个非常重要的概念,它有多种用途,本文将详细介绍 static 关键字在 Java 中的作用。...对 static 关键字的理解和使用是 Java 编程的基本功之一。

    Java 数组 基本知识点以及使用

    在 Java 中,可以使用以下两种方式来声明和初始化数组: 1. 使用 new 关键字:`int[] scores = new int[5];` 2. 使用大括号初始化数组:`int[] scores = {10, 20, 30, 40, 50};` 数组的索引 数组的索引从 0 开始...

    通过两点经纬度,计算他们之间的距离 - JAVA

    在JAVA编程中,计算两点经纬度之间的距离是一个常见的地理计算任务,主要应用于地图应用、导航系统或者地理位置服务等。这个任务通常使用哈弗辛公式(Haversine formula)来实现,该公式基于球面三角学,可以计算...

    Java版_经纬度两点间距离计算(LngLat)

    ### Java版_经纬度两点间距离计算(LngLat) #### 概述 本文将详细介绍一个用Java实现的计算两个地理位置(通过经纬度表示)之间距离的方法。该方法基于Haversine公式,这是一种广泛用于导航领域中的算法,可以精确...

Global site tag (gtag.js) - Google Analytics