原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev

很少看到文章能把静态这个问题解释的很清楚,有些文章绕来绕去很复杂。这篇解释静态问题的小文通透而容易理解。所以我把它翻译一下,让大家能好好理解关于静态。

其实对于Java静态的引入,考虑目标是使用和运行的便捷,不需要再实例化,特别是一些工具性质的代码段。当不用再实例化时,就可以相当于直接使用,增加了公共代码复用的便捷性。

从Java8开始,还支持了静态接口,使得接口的使用更便捷和灵活。另外对于接口还支持了默认方法,也就是如果使用这种定义也可以在方法中加入代码了。接口在程序中的作用越来越重要了。

-------------------------------以下说明Java的静态问题--------------

Java的static关键字,在Java程序中经常会使用的。

一般来说,Java中的静态概念用于在Java中创建类级别的变量,静态变量和静态方法是类的一部分,而不是类的实例。

关于Java的静态

Java的静态形式有5中类型:静态变量、静态方法、静态块、内部静态类和静态接口方法(Java8以上支持)

1、静态变量

我们用Static表示变量的级别,一个类中的静态变量,不属于类的对象或者实例。因为静态变量与所有的对象实例共享,因此他们不具线程安全性。

通常,静态变量常用final关键来修饰,表示通用资源或可以被所有的对象所使用。如果静态变量未被私有化,可以用“类名.变量名”的方式来使用。

//static variable example
private static int count;
public static String str;
public static final String DB_USER = "myuser";

2、静态方法

与静态变量一样,静态方法是属于类而不是实例。

一个静态方法只能使用静态变量和调用静态方法。通常静态方法通常用于想给其他的类使用而不需要创建实例。例如:Collections class(类集合)。

Java的包装类和实用类包含许多静态方法。main()方法就是Java程序入口点,是静态方法。

//static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
} //static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
}

从Java8以上版本开始也可以有接口类型的静态方法了。

3、静态块

Java的静态块是一组指令在类装载的时候在内存中由Java ClassLoader执行。

静态块常用于初始化类的静态变量。大多时候还用于在类装载时候创建静态资源。

Java不允许在静态块中使用非静态变量。一个类中可以有多个静态块,尽管这似乎没有什么用。静态块只在类装载入内存时,执行一次。

static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
}

4、静态类

Java可以嵌套使用静态类,但是静态类不能用于嵌套的顶层。

静态嵌套类的使用与其他顶层类一样,嵌套只是为了便于项目打包。

让我们来看一个使用静态的样例程序:

StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    //static block
static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
} //multiple static blocks in same class
static{
System.out.println("StaticExample static block2");
} //static variable example
private static int count; //kept private to control it's value through setter
public static String str; public int getCount() {
return count;
} //static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
} //static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
} //static class example - used for packaging convenience only
public static class MyStaticClass{
public int count; } }

接下来,在测试程序中使用这些静态变量、静态方法和静态类。

TestStatic.java

package com.journaldev.misc;

public class TestStatic {

    public static void main(String[] args) {
StaticExample.setCount(5); //non-private static variables can be accessed with class name
StaticExample.str = "abc";
StaticExample se = new StaticExample();
System.out.println(se.getCount());
//class and instance static variables are same
System.out.println(StaticExample.str +" is same as "+se.str);
System.out.println(StaticExample.str == se.str); //static nested classes are like normal top-level classes
StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
myStaticClass.count=10; StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
myStaticClass1.count=20; System.out.println(myStaticClass.count);
System.out.println(myStaticClass1.count);
} }

执行结果如下:

原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev

很少看到文章能把静态这个问题解释的很清楚,有些文章绕来绕去很复杂。这篇解释静态问题的小文通透而容易理解。所以我把它翻译一下,让大家能好好理解关于静态。

其实对于Java静态的引入,考虑目标是使用和运行的便捷,不需要再实例化,特别是一些工具性质的代码段。当不用再实例化时,就可以相当于直接使用,增加了公共代码复用的便捷性。

从Java8开始,还支持了静态接口,使得接口的使用更便捷和灵活。另外对于接口还支持了默认方法,也就是如果使用这种定义也可以在方法中加入代码了。接口在程序中的作用越来越重要了。

-------------------------------以下说明Java的静态问题--------------

Java的static关键字,在Java程序中经常会使用的。

一般来说,Java中的静态概念用于在Java中创建类级别的变量,静态变量和静态方法是类的一部分,而不是类的实例。

关于Java的静态

Java的静态形式有5中类型:静态变量、静态方法、静态块、内部静态类和静态接口方法(Java8以上支持)

1、静态变量

我们用Static表示变量的级别,一个类中的静态变量,不属于类的对象或者实例。因为静态变量与所有的对象实例共享,因此他们不具线程安全性。

通常,静态变量常用final关键来修饰,表示通用资源或可以被所有的对象所使用。如果静态变量未被私有化,可以用“类名.变量名”的方式来使用。

//static variable example
private static int count;
public static String str;
public static final String DB_USER = "myuser";

2、静态方法

与静态变量一样,静态方法是属于类而不是实例。

一个静态方法只能使用静态变量和调用静态方法。通常静态方法通常用于想给其他的类使用而不需要创建实例。例如:Collections class(类集合)。

Java的包装类和实用类包含许多静态方法。main()方法就是Java程序入口点,是静态方法。

//static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
} //static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
}

从Java8以上版本开始也可以有接口类型的静态方法了。

3、静态块

Java的静态块是一组指令在类装载的时候在内存中由Java ClassLoader执行。

静态块常用于初始化类的静态变量。大多时候还用于在类装载时候创建静态资源。

Java不允许在静态块中使用非静态变量。一个类中可以有多个静态块,尽管这似乎没有什么用。静态块只在类装载入内存时,执行一次。

static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
}

4、静态类

Java可以嵌套使用静态类,但是静态类不能用于嵌套的顶层。

静态嵌套类的使用与其他顶层类一样,嵌套只是为了便于项目打包。

让我们来看一个使用静态的样例程序:

StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    //static block
static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
} //multiple static blocks in same class
static{
System.out.println("StaticExample static block2");
} //static variable example
private static int count; //kept private to control it's value through setter
public static String str; public int getCount() {
return count;
} //static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
} //static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
} //static class example - used for packaging convenience only
public static class MyStaticClass{
public int count; } }

接下来,在测试程序中使用这些静态变量、静态方法和静态类。

TestStatic.java

package com.journaldev.misc;

public class TestStatic {

    public static void main(String[] args) {
StaticExample.setCount(5); //non-private static variables can be accessed with class name
StaticExample.str = "abc";
StaticExample se = new StaticExample();
System.out.println(se.getCount());
//class and instance static variables are same
System.out.println(StaticExample.str +" is same as "+se.str);
System.out.println(StaticExample.str == se.str); //static nested classes are like normal top-level classes
StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
myStaticClass.count=10; StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
myStaticClass1.count=20; System.out.println(myStaticClass.count);
System.out.println(myStaticClass1.count);
} }

执行结果如下:

StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20

可见,静态块代码是最先被执行的,而且是只在类载入内存时执行。

静态import

一般,Java允许用静态成员使用类引用,从Java1.5开始,我们可以使用静态import而不用类引用。下面是一个简单的静态import的例子。

package com.journaldev.test;

public class A {

	public static int MAX = 1000;

	public static void foo(){
System.out.println("foo static method");
}
}
package com.journaldev.test;

import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo; public class B { public static void main(String args[]){
System.out.println(MAX); //normally A.MAX
foo(); // normally A.foo()
}
}

第2段代码用了import语句,导入静态类使用import static,后面跟着的是静态成员的全称。

为了导入一个类中的所有的静态成员,可以这样写“import static com.journadev.test.A.*”,这只有在我们要多次使用一个类的静态变量时,才这样写,但这种写法的可读性不好。

StaticExample static block

StaticExample static block2
5
abc is same as abc
true
10
20

可见,静态块代码是最先被执行的,而且是只在类载入内存时执行。

静态import

一般,Java允许用静态成员使用类引用,从Java1.5开始,我们可以使用静态import而不用类引用。下面是一个简单的静态import的例子。

package com.journaldev.test;

public class A {

	public static int MAX = 1000;

	public static void foo(){
System.out.println("foo static method");
}
}
package com.journaldev.test;

import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo; public class B { public static void main(String args[]){
System.out.println(MAX); //normally A.MAX
foo(); // normally A.foo()
}
}

第2段代码用了import语句,导入静态类使用import static,后面跟着的是静态成员的全称。

为了导入一个类中的所有的静态成员,可以这样写“import static com.journadev.test.A.*”,这只有在我们要多次使用一个类的静态变量时,才这样写,但这种写法的可读性不好。

关于Java的静态:静态类、静态方法、静态变量、静态块等的更多相关文章

  1. Java静态方法,静态变量,初始化顺序

    1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...

  2. Java学习笔记8---类的静态成员变量与静态成员方法的访问与调用方式

    (注:静态变量修改为静态成员变量,静态方法改为静态成员方法) 静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员.静态成员由static修饰,是属于整个类的,所有的对象共享这些 ...

  3. js 静态方法 静态变量 实例方法 实例变量

    1.静态方法的定义 Js代码   var BaseClass = function() {}; // var BaseClass=new Function(); BaseClass.f1 = func ...

  4. Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  5. (10)C#静态方法,静态字段,静态类,匿名类

    6.静态方法 使用静态方法就可不必用类的实例化调用次函数 class Test { public static void method() { ........ } //当调用一个method()时就 ...

  6. c#学习系列之静态类,静态构造函数,静态成员,静态方法(总之各种静态)

    <1>静态类: 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.静态类最大的特点就是共享.在声明一个类时使用static关键字,具有 ...

  7. Java笔记7-多态父类静态

    多态的应用-面向父类编程 1.对象的编译时类型写成父类 2.方法的返回类型写成父类 3.方法的参数类型写成父类 编译时类型:对象的声明时类型,在于编译期间 运行时类型:new运算符后面的类型 编译时类 ...

  8. 黑马程序员——JAVA基础之主函数main和静态static,静态代码块

    ------- android培训.java培训.期待与您交流! ---------- 主函数:是一个特殊的函数.作为程序的入口,可以被jvm调用. 主函数的定义: public:代表着该函数访问权限 ...

  9. 深入理解 静态类和静态字段(C# 基础)

    序言 以前,总是被提醒,在编程过程中尽量少用静态变量,数据丢失什么的,今天有空,禁不住对静态变量的强烈好奇,跟我一起了解下静态家族的内幕吧. 静态类 定义 静态类与非静态类的重要区别在于静态类不能实例 ...

  10. Java基础 -- 嵌套类(非静态嵌套类、静态嵌套类)

    可以将一个类的定义放在另一个类的内部定义,这样的类就被称为嵌套类,包含嵌套类的类被称为外部类(outer class),也可以叫做封闭类. 嵌套类可以分为两种: 静态嵌套类(Static Nested ...

随机推荐

  1. (转)Linux开机启动(bootstrap)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机开机是一个神秘的过程.我们只是按了开机键,就看到屏幕上的进度条或者一行行的输 ...

  2. 2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼

    2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼   转眼又已过去了一年,在这一年里,Firefox 和 Chrome 在拼升级,版本号不断飙升:IE10 随着 Windows 8 在 ...

  3. STextComboBox & SComboBox

    //简单智能 SNew(STextComboBox).ContentPadding(5).OptionsSource(&Options).InitiallySelectedItem(Optio ...

  4. 基于ubuntu14视觉识别乒乓球_1

    串口通信,opencv3.0 窗口大小可调 编译 cmake ../ make ./color 正常光线下运行比较稳定,找圆比较准确.程序设置了圆的半径区间以及圆心最小间距,以满足产品的需求,可自行修 ...

  5. 2016 "Bird Cup" ICPC7th@ahstu--“波导杯”安徽科技学院第七届程序设计大赛

    "波导杯"安徽科技学院第七届程序设计大赛 原文章网页 Contest - 2016 "Bird Cup" ICPC7th@ahstu Start time:   ...

  6. springMVC修改用户请求内容

    最近在做一个微信相关的网站,很多地方涉及到微信表情的输入,导致内容无法插入到数据库,虽然有用到一个表情过滤的工具类,但是需要过滤的地方比较多,于是想到在过滤器中过滤用户请求的内容. request这个 ...

  7. SSE图像算法优化系列十:简单的一个肤色检测算法的SSE优化。

    在很多场合需要高效率的肤色检测代码,本人常用的一个C++版本的代码如下所示: void IM_GetRoughSkinRegion(unsigned char *Src, unsigned char ...

  8. Linux操作系统-命令-aptitude install unzip

    如果linux系统没有自带unzip,请执行aptitude install unzip以安装. 使用到这条Linux命令的场景是: 当我把Jmeter的压缩包(xxx.zip)拷贝到远程的Linux ...

  9. 解决Coursera视频无法观看

    修改电脑的 C:\Windows\System32\drivers\etc 目录下的host文件, 在最后添加一行: 52.84.246.72 d3c33hcgiwev3.cloudfront.net

  10. 01-artDialog4.1.7常用整理

    关闭弹出框的几种常见方法: 1,artDialog可以通过鼠标双击关闭对话框,esc关闭对话框等.为了在关闭对话框要执行某一方法,不能仅仅在弹框中的关闭按钮中写.这时提供了一个函数:close.无论在 ...