细说static关键字及其应用

场景



先看段代码,考虑以下场景,其运行结果是什么?

public class Test {

    static int i = 8;

    public void printI() {
        int i = 88;
        System.out.println(this.i);
    }

    public static void main(String arg[]) {
        Test t = new Test();
        t.printI();
    }
}

最后的运行结果是:8

如果把 this 关键字去掉的话,则结果是 88 ,当然这里有一些对关于 this 关键字的考察。

static 关键字



包含了使用 static 关键字声明的变量或者方法与包含它的类实例对象是没有关联的。因为静态化的域或者方法在类实例化前就已经加载入内存当中了,而并非是需要实例化该类声明的对象后,内存中才会为其分配内存。让我们再看看下面的代码:

class Test {

    static int i = 8;

    public void printI() {
        System.out.println("i:"+this.i);
    }

    public static void main(String arg[]) {
        System.out.println(Test.i);
        Test.test();

        Test.i++; // 自增i
        Test a = new Test(); //声明测试对象a
        a.printI();
        a.i++; // 自增i

        Test b = new Test();//声明测试对象b
        b.printI();
    }
}

运行结果:

8

i:9

i:10

正如上面所说的,变量 i 脱离于对象实例化而存在,即使我们在分别声明对象 a 和对象 b ,当我们对a对象的i进行自增操作后,后面的b对象却打印 9,因为对象 a和 b 是共用变量 i 的。

静态方法



静态方法不可以调用非静态的方法或者变量,反之非静态方法是可以调用静态方法的。例如:

int j = 10;

public static void test() {
    System.out.println("j:"+ j);
}

会发现编译器提示这样的错误:Cannot make a static reference to the non-static field j 而我们很容易写出这样的代码。显然静态方法给我们编写代码时带来了非常大的便利,我们无须在调用其方法时需要实例化其对象,我们在封装我们的 Utils 工具类时经常这样做,因为这样做既方便又可提升程序的性能。《Effective Java》中有详细讲到static工厂方法。

static之单例应用

正如上面代码片段2中所看到的实例一样,静态变量无须实例化便可调用,且被修饰的域是静态处于内存中的,所以对于那些被频繁实例化的对象,为了避免多次重复的实例化,我们可以通过静态化该对象,从而实现对程序的性能优化。例如我们经常会在 Web 项目里面静态化 JDBC 链接对象,或者业务逻辑层 中的对象,,或者封装工厂方法,然后写个工厂单例类。当然我们已经有了 Spring ,通过利用反射机制,统一管理这些Bean对象,实现自动的按需注入。在 Playframework 这个快速开发 Web 的框架中,其 Controller 中的方法都被声明为了静态方法。声明单例的方法有很多种,请看下面的代码:


public class Singleton {

private final static Singleton INSTANCE = new Singleton();
private Singleton() {}

public static Singleton getInstance() {
    return INSTANCE;
}

public void test() {
    System.out.println("this is a test method.");
}
}

该类的构造方法被 private关键字修饰,意味着该对象不可用new关键字进行实例化了,当然我们已经在此类中提供了静态方法 getInstance 通过这个方法获取该类的静态实例对象。由于该对象实例后被保存在了静态变量INSTANCE 中,所以调用者每次调用的都是这个实例对象。调用示例:

    Singleton c = Singleton.getInstance();

    c.test(); // 调用test方法

细说static关键字及其应用

时间: 2024-10-06 09:20:17

细说static关键字及其应用的相关文章

Static关键字

1.static修饰的资源属于类级别的资源,静态的资源,对于类的所有实例对象的共享的资源 2.static关键字可以用来修饰属性,方法,代码块 3.static修饰的资源,在类加载期间执行 Static修饰的属性 static关键字修饰属性,属于对类所有实例对象共享的变量 访问静态的属性:类名.属性名 Static修饰的方法 static关键字修饰的方法属于静态方法可以直接类名.方法名()进行调用,一般的是把静态方法作为工具方法 静态方法中不能调用对象的资源(对象属性,对象方法); Static

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

java中static关键字的理解

static关键字 解决两种问题 1.   只想为某特定域分配单一的存储空间,而不去考虑究竟要创建多少对象,甚至根本不创建任何对象 2.   希望某种方法不与包含它的任何对象关联在一起,也就是说,即使没有创建对象也能调用这个方法 当static作用于某个字段时,肯定会改变数据创建的方式,因为一个static字段对每个类时只有一份存储空间,而非static字段则是对每一个对象都有一个存储空间 和其他方法一样,static方法可以创建或使用其类型相同的被命名的对象,因此static方法常常被拿来做牧

java编程思想-——static关键字

对于java来说,创建类时候,就是在描述那个类的对象的外观和行为.除非用new创建那个类的对象,否则,实际上并未获得任何对象.执行new操作的时候,数据存储空间才被分配,其方法才被外界所调用. 1.什么是static关键字 static关键字标示的变量和方法,只分配单一的存储空间.不去考虑究竟要创建多少个对象,甚至根本就不用创建对象.没有创建对象也可以访问static标记的对象或者方法. 对于static标记的对象,即可以用对象来操作,也可以用类来操作. 2.static的一些用法. 对于sta

static关键字的使用(有个深刻领悟)

没有实例化对象的时候进行可以调用static 属性  static方法 (用类名去调用) 非static定义的方法可以调用static的属性或方法. static定义的方法不能调用非static的方法或属性: 非static方法几乎都有一个特点:方法要由实例化对象调用 或者在web开发中,由url调用 /* 最深刻透彻醍醐灌顶的领悟*/ 以前想为啥啊,那个url就可以执行了非static方法了 Servlet的工作原理就是反射,所有,MVC框架的controller都是这个机制 Servlet的

static关键字的使用

static关键字的使用: * 1.static:静态的 * * 2.static可以用来修饰:属性.方法.代码块.内部类. * * 3. 使用static修饰属性:类变量(或静态变量 * >使用static修饰的变量,被类的所对象所共享:类的所对象共同同一个静态变量. * 对比:不用static修饰的属性,称为:实例变量.每个对象拥一份实例变量.通过对象a修改某个实例变量, * 不会影响其他对象同名的实例变量的值. * >我们可以通过对象a去调用或修改静态变量的值,那么会影响其他对象对此静态

Java static 关键字

本文介绍 Java static 关键字的用法和注意点: 1. 使用 static 声明属性--即 static 声明全局属性 2. 使用 static 声明方法--即通过类名直接调用 static 方法 注意点: 使用 static 方法的时候,只能访问 static 声明的属性和方法,而非 static 声明的方法和属性是不能访问的. 我们使用如下代码声明三个对象,并且相应的进行赋值: package hello; class People2{ String name; int age; p

PHP static 关键字和 self 关键字实例化的区别

在实例化时,static 关键字类似于 self 关键字,但 static 关键字指的是被调用的类,而 self 关键字指的是包含类. 这样说可能不太好理解,接下来举一个例子. 首先创建一个超类 DomainObject ,该类包含功能可被其扩展类共用,其次创建一个子类 Document . 代码如下: abstract class DomainObject { public static function create() { return new self(); } } class Docu

5.JAVA基础复习——JAVA中的static关键字作用与用法

static关键字: 特点: 1.static是一个修饰符,用于修饰成员.(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量. 2.static修饰的成员被所有的对象共享. 3.static优先于对象存在,因为static的成员随着类的加载就已经存在. 4.static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员). 5.static修饰的数据是共享数据,对象中的存储的是特有的数据. 1 private static int age;//用static