java里的static

本节介绍JAVA里static的作用和使用方法以及一些需要注意的问题.

static表示"全局"或"静态",用来修饰成员变量和成员方法,以及代码块.

被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,JAVA虚拟机就能根据类名在运行时数据区的演绎法我内找到它们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象.

用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量.

static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其它静态成员方法中使用(当然也可以在非静态成员方法中使用--废话).但是不能在其它类中通过类名来直接引用,这一点很重要.实际上只要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解了.static前面加上其它访问权限关键字的效果也以此类推.

static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:

类名.静态方法名(参数)

类名.静态变量名

用static修饰的代码块表示静态代码块,当java虚拟机(JVM)加载类时,就会执行该代码块.

1. static变量

  按照是否静态可把成员变量分为两类:被static修饰的静态变量和没有被static修饰的实例变量.

  两者的区别是:

  对于静态变量在内在中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(不推荐).

  对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内在中有多个拷贝,互不影响(灵活).

  所以一般在需要实现以下两个功能时使用静态变量:

    *在对象之间共享值时

    *方便访问变量时

2. 静态方法

  静态方法可以直接通过类名调用,任何的实例也都可以调用.

  因此,静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(即非静态变量和非静态方法),只能访问所属类的静态成员变量和成员方法.因为实例成员与特定的对象关联!

  但这并不是绝对的,如果想要在static方法中调用非静态的变量或者方法,

  因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract.

  例如,为了方便方法的调用,JAVA API中的Math类中的所有方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用.

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

3. static代码块

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

  利用静态代码块可以对一些static变量进行赋值.

4. static final ...

  static final用来修饰成员变量和成员方法,可简单理解为"全局变量".

  对于变量,表示一旦给值就不可修改,并且通过类名可以访问.

  对于方法,表示不可覆盖,并且可以通过类名直接访问.

  有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象.通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员它能够被它自己使用,而不必引用任何对象.你可以将方法和变量都声明为static,static成员的最觉的例子是main(),困为在程序开始执行时必须调用main(),所以它被声明为static.

  

声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制: • 它们仅能调用其他的static 方法。 • 它们只能访问static数据。 • 它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。 如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。

  

时间: 2024-12-25 20:18:45

java里的static的相关文章

java里的static/final含义

java里的static/final含义 static static可以修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类) static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变.因此static修饰的属性必须有初始值(数值型变量默认值为0,布尔型默认值为false,引用类型默认值为null).类加载后,存储在方法区(metaspace) static修饰的属性所有对象都只有一个值(但是多个实例都可以同时修改,因此不具有线程安全性). static修饰的属性强调(在多个实

Java里数值类型转换

1 import static java.lang.System.out; 2 3 public class testOnNumber { 4 public static void main(String[] args){ 5 //int转换成short,把低位截断给short 6 int i = 0xa0001231; 7 out.println(Integer.toBinaryString(i)); 8 out.println(i); 9 short s = (short) i; 10 ou

java中的static详解

如果一个类成员被声明为static,它就能够在类的任何对象创建之前被访问,而不必引用任何对象.static 成员的最常见的例子是main( ) .因为在程序开始执行时必须调用main() ,所以它被声明为static. 声明为static的变量实质上就是全局变量.当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量,例如:声明一个static的变量count作为new一个类实例的计数.声明为static的方法有以下几条限制: 1.它们仅能调用其他的s

Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)

生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. BlockingQueue 下面来逐一分析. 1. wait()/notify() 第一种实现,利用根类Object的两个方法wait()/notify(),来停止或者唤醒线程的执行:这也是最原始的实现. 1 public class WaitNotifyBroker<T> implements Broker&

甲骨文面试题-JAVA里的布尔运算符

重要一点: (& ,|) ==>二进制布尔运算符,(&&,||)==>条件布尔运算符 二进制布尔运算符,两边都会执行,不管左边是否为真或假==>对于运算符两边的操作数不管真假与否,都会先计算出来结果后再进行布尔逻辑运算 但是条件布尔运算符不同,更先进,如果&&左边为假,那么右边不执行:||左边为真,右边也不执行: 具体细节: JAVA里的布尔运算符可以分为[二进制布尔运算符]和[条件布尔运算符]. 1.二进制布尔运算符 二进制布尔运算符:与(&am

JAVA:从public static void main(String args[])开始

我们都知道当你要运行一个JAVA文件的时候必须要有一个main函数.这是为什么呢? 跟C语言的道理一样,当你运行一个文件的时候,你必须要有一个入口函数或者入口地址,在C里面是main函数,同样的在JAVA里面则是public static void main(String args[])这样一个入口函数.这是java程序的入口地址,java虚拟机运行程序的时候首先找的就是main方法.跟C语言里面的main()函数的作用是一样的.只有有main()方法的java程序才能够被java虚拟机欲行,可

Java 里的异常(Exception)详解

作为一位初学者, 本屌也没有能力对异常谈得很深入.   只不过Java里关于Exception的东西实在是很多. 所以这篇文章很长就是了.. 一, 什么是java里的异常 由于java是c\c++ 发展而来的,  首先我们先看看c语言里的错误. 1.1 c语言里的错误 我们实现1个程序的过程包括,  代码编写, 编译代码成为程序,  执行程序. . 其中大部分常见的语法错误都会被编译代码这样部过滤掉.   但是即使通过了编译. 执行程序这一步可能还是会有错误. 原因很多, 例如常见的除数为0,

Java基础之static关键字的用法

Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例.        静态(static)可以是: 变量(也称为类变量) 方法(也称为类方法) 代码块 嵌套类         修饰变量 被static修饰的变量称作静态变量或类变量:没有被static修饰的变量,称为实例变量.静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在类加载的过程中完成静态变量的内存分配(存储在"方法区

Java 里如何实现线程间通信

正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了.本文涉及到的知识点:thread.join(), object.wait(), object.notify(), CountdownLatch, CyclicBarrier, FutureTask, Callable 等. 下面我从几个例子作为切入点来讲解下 Java 里有哪些方法来实现线程间通信. 如何让两个线程依次执行? 那如何让 两个线程按照指定方式有序交叉运