`
bluenemo
  • 浏览: 178977 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

static方法简述

阅读更多
一、static 
  请先看下面这段程序:
  public class Hello{
    public static void main(String[] args){ //(1)
      System.out.println("Hello,world!");   //(2)
    }
  }
  看过这段程序,对于大多数学过Java 的从来说,都不陌生。即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主要用法。
  在1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。你还得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令(加下划线为手动输入):
javac Hello.java
java Hello
Hello,world!
  这就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中,你可能会想,为什么要这样才能输出。好,我们来分解一下这条语句。(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于java.lang包中的一个核心类,如果你查看它的定义,你会发现有这样一行:public static final PrintStream out;接着在进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找println,会有这样一行:
public void println(String x)。
  好了,现在你应该明白为什么我们要那样调用了,out是System的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。
静态方法
  通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:
class Simple{
   static void go(){
     System.out.println("Go...");
   }
}
public class Cal{
  public static void main(String[] args){
    Simple.go();
  }
}
  调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。
静态变量
  静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。看下面这段代码:
class Value{
  static int c=0;
  static void inc(){
    c++;
  }
}
class Count{
  public static void prt(String s){
    System.out.println(s);
  }
  public static void main(String[] args){
    Value v1,v2;
    v1=new Value();
    v2=new Value();
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    v1.inc();
    prt("v1.c="+v1.c+"  v2.c="+v2.c);  
   }
}
  结果如下:
v1.c=0  v2.c=0
v1.c=1  v2.c=1
  由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序:
class Value{
  static int c=0;
  Value(){
    c=15;
  }
  Value(int i){
    c=i;
  }
  static void inc(){
    c++;
  }
}
class Count{
  public static void prt(String s){
    System.out.println(s);
  }
    Value v=new Value(10);
    static Value v1,v2;
    static{
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
      v1=new Value(27);
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
      v2=new Value(15);
      prt("v1.c="+v1.c+"  v2.c="+v2.c);
    }
  public static void main(String[] args){
    Count ct=new Count();
    prt("ct.c="+ct.v.c);
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    v1.inc();
    prt("v1.c="+v1.c+"  v2.c="+v2.c);
    prt("ct.c="+ct.v.c);
  }
}
运行结果如下:
v1.c=0  v2.c=0
v1.c=27  v2.c=27
v1.c=15  v2.c=15
ct.c=10
v1.c=10  v2.c=10
v1.c=11  v2.c=11
ct.c=11
  这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。非静态变量不是本文的主题,在此不做详细讨论,请参考Think in Java中的讲解。
静态类
  通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。如下代码所示:
public class StaticCls{
  public static void main(String[] args){
    OuterCls.InnerCls oi=new OuterCls.InnerCls();
  }
}
class OuterCls{
  public static class InnerCls{
    InnerCls(){
      System.out.println("InnerCls");
    }
   }
}
  输出结果会如你所料:
InnerCls
  和普通类一样。内部类的其它用法请参阅Think in Java中的相关章节,此处不作详解。
分享到:
评论

相关推荐

    static关键字简介

    类的成员变量 成员方法或者是代码块 下面我们就来说说这个 static 关键字 有时候程序员可能需要定义一个类成员 对它的使用不依赖于该类的任何对象 要创建 这样的成员 成员变量声明前必须加上关键字 static 成员声明...

    C语言中关键字const、static、volatile、extern、auto、register的用法分析.doc

    C语言中关键字const、static、volatile、extern、auto、register的用法分析 本文将对C语言中的六个关键字:const、static、volatile、extern、auto、register进行详细的分析和解释。 一、const关键字 Const关键字...

    Spring JdbcTemplate 常用方法整理

    本文将深入探讨Spring JdbcTemplate的常用方法,并结合提供的`JsonBean.java`和`JdbcUtils.java`文件,来理解其在实际应用中的使用。 首先,JdbcTemplate的核心功能在于它提供了一系列的方法来执行SQL语句,包括...

    重载与覆写/重写的区别

    public static void main(String[] agrs) { Base b = new Dog(); b.test(0); b.test((byte) 0); } } 复制代码 这时的输出结果是1 0,这是运行时动态绑定的结果。  简单说来重写就是子类对...

    前端开源库-koa-static-namespace

    **一、Koa 框架简述** Koa 是由 Express 团队开发的一个下一代 web 开发框架,它基于 Node.js 的原生异步函数,旨在提供更轻量级和模块化的特性。Koa 的核心是中间件系统,每个中间件可以访问请求对象(request)、...

    C#重写重载与多态

    public static void Main() { IAnimal animal1 = new Dog(); IAnimal animal2 = new Cat(); animal1.Speak(); // 输出 "Woof!" animal2.Speak(); // 输出 "Meow!" } } ``` 在这个例子中,`Dog`和`Cat`都实现...

    简述Springboot @Async 异步方法

    异步方法必须是实例方法,因为 static 方法不能被 Override。@Async 异步方法的实现原理是通过注入一个代理类到 Bean 中,这个代理继承这个 Bean,需要覆写异步方法并执行。然后这个东西,会被 Spring 放到自己维护...

    java 方法的流程控制与异常处理

    2. **简述Java的异常处理机制。** - Java提供了强大的异常处理机制,主要包括以下组成部分: - `try`块:用于包含可能抛出异常的代码。 - `catch`块:用于捕获并处理异常。 - `finally`块:无论是否发生异常都会...

    Odoo的网页模块QWEB简述.doc

    Odoo 网页模块 QWEB 简述 Odoo 的网页模块 QWEB 是一个基于 OpenERP 的网页模块,负责处理网页相关的逻辑和展示。QWEB 模块是 OpenERP 中的一个重要组件,负责生成网页的视图和模板。在本文中,我们将对 Odoo 的 ...

    简述Java List去重五种方法

    Java List去重五种方法 Java List去重是Java编程中的一种常见操作,用于从List中删除重复的元素。在本文中,我们将介绍五种不同的方法来实现Java List去重。这些方法包括使用Java 8的Stream API、双重for循环、Set...

    Java基础知识点.html

    跳转控制语句 三元运算符 逻辑运算符 短路逻辑运算符 数组 方法简述 switch语句 if语句 关系运算符 自增自减运算符 赋值运算符 算术运算符 类型转换 Java简述 标识符 变量 数据类型 常量 关键字

    java面试宝典

    34、是否可以从一个static 方法内部发出对非static 方法的调用? 11 35、写clone()方法时,通常都有一行代码,是什么? 11 36、GC 是什么? 为什么要有GC? 11 37、垃圾回收的优点和原理。并考虑2 种回收机制。 11 38...

    .NET委托解析

    委托实际上是一种类型,它可以封装指向方法的引用,允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种机制使得代码更加灵活,能够实现函数式编程风格,并且在处理异步操作时特别有用。 ...

    C#中实现抽象类里建立静态方法

    本文简述了C#中实现抽象类里建立静态方法的解决办法,示例程序如下: public class TestMain { public static void main(String[] args) { AbstractTest.out(); } } 如上面所示的程序是可以运行的。 一般情况...

    多态性的理解

    public static void main(String[] args) { Father child = new Child(); child.func1(); // 打印结果是什么? } } ``` 在这个例子中: - `Child` 类继承了 `Father` 类,并重写了 `func2()` 方法。 - 当我们...

    HashMap常见面试题,简述以及对源码操作分析

    HashMap常见面试题,简述以及对源码操作分析 HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。数组里面每个地方都存了Key-Value这样的实例,在Java7之前是Entry,在Java8中叫Node因为它本身所有...

    Java单例模式实例简述

    private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 2. 饿汉式(静态代码块): 与静态常量类似,只...

    简述Java图像倾斜方法及实例 原创

    public static void main(String[] args) { new TiltImage().setVisible(true); } // 画板 class MyCanvas extends JPanel{ public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; g2.shear(0.3,...

Global site tag (gtag.js) - Google Analytics