static是java中又一重要的关键字,在一定环境下使用,可以提高程序的运行性能,优化程序的结构。其主要应用有以下几方面:

1.static修饰的成员变量,称为类变量/静态变量,以实现所有对象对该成员的共享。

2.static修饰的成员方法,称为类方法/静态方法,可直接通过类名调用,无需创建对象。

3.形成静态代码块,优化程序性能。

4.静态导包,一般将类的方法直接导入到当前类中,从而直接使用方法名即可调用类方法,更加方便。

5.修饰内部类,无需实例化外部类就可以调用内部类。

下面一一附代码说明:

1.

public class Student {
        String name;
        static int age;
        public String toString() {
            return "Name:" + name + ", Age:" + age;
        }
        public static void main(String[] args) {
          Student s1 = new Student();
            s1.name="张三";
            s1.age=20;
           Student s2 = new Student();
            s2.name="李四";
            s2.age=10;
            System.out.println(s1);
            System.out.println(s2);
        }
}
/**输出结果
Name:张三, Age:10
Name:李四, Age:10
*/

如上述代码,s1和s2两个对象分别存储在内存中堆区域的不同地址中,所以他们之间相互不会干扰。然而static关键字修饰了成员变量age,让其变成类的所属,而不是对象的所属,任何该类实例的对象都可以共享使用它。所以,输出的age均是最终赋给的10。如果去掉static,显然对象之间互不影响,输出如下:

Name:张三, Age:20
Name:李四, Age:10

.

如上述代码,out1调用out2时出错。由此代码可得,静态方法不能调用非静态的成员变量和成员方法。非静态方法可以调用静态的成员变量和成员方法。注意,static不影响成员的访问权限,Java中能够影响到访问权限的关键词是private、public、protected,default。

3.

 public class Test extends Base{
     static{
         System.out.println("static静态块1");
     }
     public Test(){
         System.out.println("test构造器");
     }
     public static void main(String[] args) {
         new Test();
     }
 }

 class Base{
     static{
         System.out.println("static静态块2");
     }
     public Base(){
         System.out.println("base构造器");
     }
 }

如上述代码,记住两句话,static代码块随类的加载一起加载。static修饰的变量方法比其他变量方法优先加载,且只加载一次。加载子类时,会首先加载父类。由此可以分析:在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Test类,而在加载Test类的时候发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类的时候,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器。因此,运行结果如下:

static静态块2
static静态块1
base构造器
test构造器

4.

/* A.java文件 */
package com.dogo.test;
public class A {
    public static void outWord(Object o){
        System.out.println(o);
    }
}

/* B.java文件 */
import static com.dogo.test.A.*;
public class B
{
    public static void main( String[] args )
    {
        outWord("Hello World!");
    }
    /**输出
     * Hello World!
     */
}

如上述代码,A.java中包含一个简单的静态方法,在B.java中我们用static关键字将A类导入由此,便无需使用“类名.方法名”的方法去调用类方法了,直接可以采用"方法名"去调用类方法,就好像是该类自己的方法一样。

5.

/*Outer.java*/
public class Outer {
  static {
        System.out.println("Outer静态块");
    }
    public Outer(){
        System.out.println("Outer构造器");
    }
    static class Inner{
        static{
            System.out.println("Inner静态块");
        }

        public Inner(){
            System.out.println("Inner构造器");
        }
    }
}
/*Test.java*/
public class Test{
    public static void main(String[] args) {
        new Outer.Inner();
    }
}

如上述代码,记住,用static修饰内部类,外部类可以直接调用内部类,因为static修饰的的内部类是在加载外部类的同时加载的,所以,并不要实例化外部类就能直接调用静态内部类。例子中,在进入Test的main方法之前,加载Test类,然后执行new Outer.Inner();这里需要注意:因为Inner是静态的,所以这里并不需要加载外部类和实例化外部类,可以直接加载Inner并实例化。运行结果如下:

Inner静态块
Inner构造器

大乔注:static另一个很重要的应用就是实现单例设计模式。单利模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,于是只能把创建对象的方法声明为static,程序实例如下:

    class SingleDemo{
        private static SingleDemo ins=null;
        private SingleDemo(){}
        public static SingleDemo getIns(){
            if(ins==null){
                ins=new SingleDemo();
            }
            return ins;
        }
    }  

Inner静态块
I

小乔注:java关键字static的更多相关文章

  1. java关键字static使用总结

    java关键字static使用总结 1.static修饰的方法被称之为静态方法也叫做类方法,加static的方法,可以通过类名直接访问,不加static的方法只能通过对象名访问. 静态方法可以直接通过 ...

  2. java笔记——Java关键字static、final使用小结

    static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...

  3. Java关键字--static

    在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variable ...

  4. Java关键字static、final

    static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...

  5. Java关键字static、final使用小结

    static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...

  6. [JAVA关键字] static & final

    JAVA十分常见的关键字static & final 总的来说final表示常量,即不可更改的:而static表示静态,即全局的 1. final 类:不能被继承 2. final 方法:能被 ...

  7. Java 关键字 static

    关键字static作用如下: 1. 为某个基本数据类型或对象分配单一的存储空间. 2. 实现某个属性或方法与类关联.在类被加载后类名可以直接调用静态成员方法(下面简称静态方法)或者访问静态成员变量(下 ...

  8. java 关键字static

    在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块. Java把内存分为栈内存和堆内存, 栈内存用来存放一些基本类型的变量.数组和对象的引用, 堆 ...

  9. java关键字“static”

    Java中static使用方法 1.static静态变量 静态变量:每个类只有一个,所有实例共享: 实例变量:每个实例只有一个: package test2; import java.lang.Str ...

随机推荐

  1. 利用reverse索引优化like语句的方法详解

    在有一些情况下,开发同学经常使用like去实现一些业务需求,当使用like时,我们都知道使用like 前%(like '%111')这种情况是无法使用索引的,那么如何优化此类的SQL呢,下面是一个案例 ...

  2. iOS 跳转到 App Store 下载评分页面

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. php通过system()调用Linux命令问题

    最近在做php和linux crontab的联调,发现php在linux下的权限问题需要引起注意,调试问题的过程中发现有许多问题前人说的比较零散,我在这里汇总,顺带抛砖引玉一下. 1.$result= ...

  4. caffe CuDNN报错问题解决

    解决cudnn问题:Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled wi ...

  5. 如何安装mysql

    如何安装mysql对于初学者来说的确是很麻烦,首先要知道安装mysql仅仅只是安装一个mysql系统,是没有任何可视化操作界面的,所以还要安装一个mysql的管理工具,这是初学者容易蒙的地方之一. m ...

  6. <!--[if lte IE 8][endif] ]-->IE下判断IE版本的语句

    <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见 <!--[if lte IE 7]> <![endif]--> ...

  7. OpenStack运维(二):OpenStack计算节点的故障和维护

    1.计划中的维护 举例:需要升级某一个计算节点的硬件配置,需要将计算节点上的虚拟机迁移后在对其进行操作,分为两种情况. 1.1 云系统使用了共享存储 a. 获取虚拟机列表:nova list --ho ...

  8. javascript01

    手敲代码01 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  9. 学习时用的软件最新 开发环境为Visual Studio 2010,数据库为SQLServer2005,使用.net 4.0开发。 超市管理系统

    一.源码特点 1.采用典型的三层架构进行开发.模板分离,支持生成静态 伪静态..购物车.登陆验证.div+css.js等技术二.功能介绍 1.本源码是一个超市在线购物商城源码,该网上商城是给超市便利店 ...

  10. 队列详解及java实现

    导读 栈和队列是有操作限制的线性表. 目录 1.队列的概念.特点.存储结构. 2.栈队列的java实现. 概念 队列是一种在一端进行插入,而在另一端进行删除的线性表.1.队列的插入端称为队尾:队列的删 ...