关于Java的静态:静态类、静态方法、静态变量、静态块等
原文地址: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的静态:静态类、静态方法、静态变量、静态块等的更多相关文章
- Java静态方法,静态变量,初始化顺序
1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...
- Java学习笔记8---类的静态成员变量与静态成员方法的访问与调用方式
(注:静态变量修改为静态成员变量,静态方法改为静态成员方法) 静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员.静态成员由static修饰,是属于整个类的,所有的对象共享这些 ...
- js 静态方法 静态变量 实例方法 实例变量
1.静态方法的定义 Js代码 var BaseClass = function() {}; // var BaseClass=new Function(); BaseClass.f1 = func ...
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- (10)C#静态方法,静态字段,静态类,匿名类
6.静态方法 使用静态方法就可不必用类的实例化调用次函数 class Test { public static void method() { ........ } //当调用一个method()时就 ...
- c#学习系列之静态类,静态构造函数,静态成员,静态方法(总之各种静态)
<1>静态类: 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.静态类最大的特点就是共享.在声明一个类时使用static关键字,具有 ...
- Java笔记7-多态父类静态
多态的应用-面向父类编程 1.对象的编译时类型写成父类 2.方法的返回类型写成父类 3.方法的参数类型写成父类 编译时类型:对象的声明时类型,在于编译期间 运行时类型:new运算符后面的类型 编译时类 ...
- 黑马程序员——JAVA基础之主函数main和静态static,静态代码块
------- android培训.java培训.期待与您交流! ---------- 主函数:是一个特殊的函数.作为程序的入口,可以被jvm调用. 主函数的定义: public:代表着该函数访问权限 ...
- 深入理解 静态类和静态字段(C# 基础)
序言 以前,总是被提醒,在编程过程中尽量少用静态变量,数据丢失什么的,今天有空,禁不住对静态变量的强烈好奇,跟我一起了解下静态家族的内幕吧. 静态类 定义 静态类与非静态类的重要区别在于静态类不能实例 ...
- Java基础 -- 嵌套类(非静态嵌套类、静态嵌套类)
可以将一个类的定义放在另一个类的内部定义,这样的类就被称为嵌套类,包含嵌套类的类被称为外部类(outer class),也可以叫做封闭类. 嵌套类可以分为两种: 静态嵌套类(Static Nested ...
随机推荐
- 主流页面编辑器比对:TinyMCE VS FCKeditor
开发中先用的是 FCKeditor 编辑器,感觉页面展示的东西太繁琐,所以换了 TinyMCE 编辑器. 为了方便理解,本文不采用穿插比对 先看 FCKeditor : 1.jsp :结束标签不能贴着 ...
- Java 字符串截取问题
编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4 public class StringSplit ...
- 解决lxml不含etree模块导致scrapy startproject ***出错
本文环境:win10(64) python3.6(64) 背景:之前已成功安装scrapy(1.4.0),但在命令行敲 scrapy startproject ***出错,错误提示:from ... ...
- HTML+CSS+JS简介
1.HTML与 CSS 1 1.1 HTML 1 1.2 HTML5 2 1.2.1 HTML5的特性 3 1.3 CSS 4 2.JavaScript 6 2.1特性 7 2.2编程 8 3.Sp ...
- NYOJ 25 A Famous Music Composer
A Famous Music Composer 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 Mr. B is a famous music composer. O ...
- PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
文件锁全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止 ...
- mysql创建定时任务,每月1号删除上月数据
1.创建存储过程: CREATE DEFINER=`gzy`@`%` PROCEDURE `delLastMonth`() BEGIN DECLARE lastmonth int; SET lastm ...
- [算法题] Remove Element
题目内容 本题来源:LeetCode Given an array and a value, remove all instances of that value in place and retur ...
- 诡异错误一: ValueError: embedded null character
使用如下语句读取名为0_xx.txt 文件时,遇到错误 ValueError: embedded null character if __name__ == '__main__': fr = ope ...
- 学问Chat UI(2)
前言 上文讲了下要去做哪些事,重点分析了融云Sdk中RongExtension这个扩展控件,本文来学习下同样是融云Sdk中的AutoRefreshListView如何适配多种消息的实现方式,写的有不足 ...