原文地址: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. Object-C 里面的animation动画效果,核心动画

    #import "CoreAnimationViewController.h" @interface CoreAnimationViewController ()@property ...

  2. Python正则表达式指南(转)

    原文地址:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python ...

  3. python函数(4):递归函数及二分查找算法

    人理解循环,神理解递归!  一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? ""& ...

  4. springboot启动时报错No session repository could be auto-configured.....

    具体异常提示: Error starting ApplicationContext. To display the auto-configuration report re-run your appl ...

  5. SSE再学习:灵活运用SIMD指令6倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由180ms降低到30ms)。

    这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助.可我觉得人类所谓的幸福,可以分为 ...

  6. Android数据库

    Android数据库 什么情况下我们才用数据库做数据存储? 大量数据结构相同的数据需要存储时.Android内置了sqlite,轻量级. 创建数据库的方法 创建一个类继承SqliteOpenHelpe ...

  7. HttpStatus各种状态

    JS.ns("JS.HTTPStatus","JS.XMLHttpRequest"); /** * FC 2616 HTTP1.1规范的HTTP Status状 ...

  8. solr6.5 的安装与配置

    运行环境: JDK:    1.8.0_131 Tomcat: 9.0.0.M21 Solr:      6.5.1 注:1.建议打开两个连接linux的窗口,一个负责 solr压缩目录,另外一个负责 ...

  9. 【某集训题解】【DAY 2 T3】与非

    题目描述 作为一名新世纪共产主义的接班人,你认识到了资本主义的软弱性与妥协性,决定全面根除资本主义,跑步迈入共产主义.但是当你即将跨入共产主义大门的时候,遇到了万恶的资本家留下的与非电路封印,经过千辛 ...

  10. ABP+AdminLTE+Bootstrap Table权限管理系统第八节--ABP错误机制及AbpSession相关

    上一节我们讲到登录逻辑,我做的登录逻辑很简单的,我们来看一下abp module-zero里面的登录代码. #region Login / Logout public ActionResult Log ...