Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html
一、概述
static关键字是Java诸多关键字中较常使用的一个,从其本意可得其意:静态,何为静态呢?静,即不动,静止,固定不变之意(其实可以理解为存储位置不变)。
Java中的静是相对于“动”而言的,所谓的动就是可变化的内容。
当然这里指的是针对类而言的,静态内容指的是在类被JVM加载的时候就确定的内容,这部分内容只会被分配一次内存,即在内存中保留一份存储,动态内容则不同,它们是随类的对象创建而动的,每当创建一个对象的时候就会对这些内容分配一份内存,即每个对象都有自己独有的内存存储空间(其中保存着那些动态的内容)。
静态的内容是属于类的,动态的内容属于对象。
上面的描述是及其概括的描述,下面我们仔细的了解下static的作用。
二、作用
2.1 static修饰变量
static是一种修饰符,最常用的就是修饰变量,static修饰的变量含有全局的意味,这个变量会变得脱颖而出,不再受对象的桎梏,它在类加载的时候就会分配内存来存储,存储在运行时数据区中的方法区中,属于类级别的存在,可以使用类名点用。
如果我们在类StaticTest中定义一个如下的静态变量:
static int i = 1;//申明静态变量
那么我们就可以使用下面的方式进行使用:
StaticTest.i = 3;//类名点用
静态变量可被其他方法直接调用,因为静态变量早于或同于其他变量、方法而存在,故而可被随意使用,但非静态变量不可以,因为非静态变量属于对象,需要在对象创建的时候才能分配内存而存在,明显在对象创建之前静态方法就无法直接调用非静态变量(因为尚不存在这个变量),当然在创建了对象之后就可以调用了,为了确保正确性,一律规定在静态方法中不能直接调用非静态变量,所有的非静态变量必须使用对象来调用。
何时使用static变量呢?
根据static变量的储存方式,我们可以看出,这种变量只会存在一份,但却可以被任意使用,可以被所有的对象所拥有,它的值的可变的,但却是共享的,一方改变,多方共享。
那么我们不难想到,我们在定义类的时候对于那些公共的、共享的属性完全可以定义成static的,这样一来,不但节省的内存消耗,而且操作性也变得非常容易,需要修改的时候,只需要修改一个,那么所有对象都会得到这个修改后的新值。
2.2 static修饰常量
常量是被final所修饰的变量的别称,final修饰变量之后,表示这个变量的值一旦赋值,则不再发生改变。如果在加上static修饰,那么这个变量就会变成一个静态常量(类常量),这个常量会在类加载时分配内存到方法区中。而仅使用final修饰的常量则是在对象创建时保存到方法区中。因为他属于对象的常量,而静态常量是属于公共的、共享的常量。
具体可以查看《Java基础系列--final、finally关键字》
2.3 static修饰方法
static修饰方法表示这些方法为静态方法,静态方法和非静态方法一样都保存在方法区中,不同之处在于动静之分,静态方法中不能直接调用非静态变量和方法。静态方法自身属于类级存在,可以使用类名点用。
近来,static方法一般用于定义工具方法,一般在一个工具类中定义,这个类内部全部为静态内容,完全作为一个工具对外进行服务(这貌似有些违背面向对象设计思想)。
2.4 static修饰代码块
代码块的存在,一般用于初始化一些变量的值,非静态代码块用于初始化非静态变量的值,该代码块在每次创建对象时都会被调用,而静态代码块用于初始化一些静态变量的值,只会在类加载的时候调用执行一次。
2.5 static修饰内部类
内部类种类较多,这里讲静态内部类,静态内部类由于其静态特性,可脱离外部类来创建对象,普通内部类必须依据外部类对象来创建内部类对象。
静态内部类中可调用外部类中的静态内容,其中包括private内容。
class Invoke{
static int i = 1;
int j = 2;
static class InnerClass1{
public void innerMethod(){
i = 3;
new Invoke().j = 4;
outMethod1();
// outMethod2();//报错
// j = 4;//报错
}
}
class InnerClass2{
public void innerMethod(){
i = 3;
outMethod1();
outMethod2();
j = 4;
}
}
static void outMethod1(){}
void outMethod2(){}
}
我们需要使用如下方式创建内部类的对象:
public class StaticTest {
public static void main(String[] args){
Invoke.InnerClass1 innerClass1 = new Invoke.InnerClass1();
Invoke.InnerClass2 innerClass2 = new Invoke().new InnerClass2();
}
}
注意第3、4行的创建方式的区别。
静态内部类和普通内部类的区别:
(1)静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
(2)静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
2.6 static导入
静态导入功能是一种较新的功能,可以单独导入某个类中的静态方法。
import static java.util.Collections.*;
import static java.util.Collections.synchronizedList;
如上第一行表示导入Collections类中的所有静态方法,而第二行仅仅导入指定的静态方法synchronizedList()。
Java基础系列--static关键字的更多相关文章
- Java基础之static关键字的用法
Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例. 静态(static)可以是: 变量 ...
- 【Java基础】static关键字相关
static关键字特点: 随着类的加载而加载. 优先于对象存在. 被所有对象共享 可以直接被类名调用. 使用注意: 静态方法只能访问静态成员. 但非静态成员可以访问静态成员. 静态方法中不能使用thi ...
- Java基础(十)--static关键字
static关键字通常应用在字段.方法.静态块,还有冷门一点的内容:静态内部类.静态导入 static字段: static字段也就是静态变量,是属于类的,被所有的对象所共享,只有当类初次加载的时候保存 ...
- Java基础(二)-static关键字分析
static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改 ...
- java基础 2 static关键字
2. static关键字 变量:静态变量在内存中只存在一份,只在类第一次实例化时初始化一次,同时类所有的实例都共享静态变量,可以直接同过类名 来访问他. 方法:静 ...
- Java基础系列--final关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...
- Java基础系列--instanceof关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8492158.html instanceof关键字是在Java类中实现equals方法最常使 ...
- java基础系列--volatile关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 1.volatile简述 据说,volatile是java语言中最轻 ...
- 【Java基础】static关键字的理解
修饰范围: 可以修饰成员变量和成员方法.静态的特点: A:随着类的加载而加载 B:优先于对象存在 C:被类的所有对象共享 这其实也是我们判断该不该使用静态的依据. 举例:饮水机和水杯的问题思考可通过类 ...
随机推荐
- MYSQL ORDER BY Optimization
ORDER BY Optimization 某些情况下,MYSQL可以使用index排序而避免额外的sorting. 即使order by语句列不能准确的匹配index,只要没有index中(不在or ...
- CCF系列之最大的矩形(201312-3)
试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩 ...
- 关于Set<Long>Map<Long,String>的一些小注意事项 自动转换类型
- mysql 查询今天,昨天,上个月sql语句 注解
今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天Select * FROM 表名 Where TO_DAYS( NOW( ) ...
- 图表工具--- ECharts.js学习(一) 简单入门
ECharts.js学习(一) 在项目开发的时候,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库.具体有哪几种可以看: 前端开发者常用的9个JavaScript图表库 EChar ...
- javascript对象的标签
[[proto]]标签 [[class]]标签 [[class]] 标签,代表这对象是哪个类型的.在js中不能直接访问到.可以通过Object.prototype.toString.call(obj) ...
- Spring注解装配
Spring 自动装配的主机有 @Autowired.@Intect.@Resource @Autowired是byType的, @Resource是byName的.我们一般用@Atutowired. ...
- AI_神经网络监督学习
神经网络的神奇之处在哪? 所有神经网络创造出来的价值,都是由一种机器学习,称之为监督学习, 下面这些例子神经网络效果拔群,通过深度学习获利最多的是在线广告 技术的进步来源于计算机视觉和深度学习 例如: ...
- jdk源码->集合->ArrayList
类的属性 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomA ...
- 使用EndNote在Word中插入参考文献的格式设置
endnote其实自带了很多参考文献格式的样式,如下图,但往往跟我们要使用的会有所出入,本文主要介绍的就是设置自定义endnote参考文献格式,以endnote X6和word2003为例,其它版本以 ...