Java中static静态关键字的使用
我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字
被静态关键字修饰的成员属于静态成员,它属于整个类所有,而并不仅仅是一个对象中的成员所共享,当系统第一次使用该类时,就会为其分配内存空间,直到该类被销毁是才进行资源回收,静态成员也有自己特有的访问方法
static可以修饰变量、方法、代码块
1、静态变量
因为局部静态变量和局部变量的使用方法一样,直接使用即可,所以对于类中定义的静态成员变量,非静态方法可以直接通过变量名访问,不用考虑其他,对于静态方法,最典型的就是public static void main(String[] args)这个入口方法,如果在这样的静态方法内部访问,需要用"类名.静态变量名"的方式进行访问,比如Hello.abc当然也可以先实例化对象,然后通过对象.静态变量名的方式来访问,但是还是推荐使用类名.静态变量名进行访问
2、静态方法
上面说了静态方法内部访问静态成员变量的方法,并且静态方法可以直接访问本类的静态变量和静态方法,不用加任何修饰,访问其他类则推荐使用类名.成员名的方式访问;那么访问普通成员变量呢?不能直接访问,应该先实例化对象,然后通过对象.成员变量名的方式进行访问,但是普通方法可以直接访问静态方法和静态变量;同理静态方法不能直接访问普通方法,也需要实例化对象.方法,这样的方式来访问普通方法。
3、静态代码块
Java在初始化变量的时候可以使用public String name = "abc";这样的方法来初始化变量的值,也可以通过下面代码块实现:
public class Hello {
public String name; //定义成员变量
{ //初始化块赋值
name = "abc";
}
}
可以使用多个初始化块,当创建类的实例时,会依次执行这些代码块,通过static关键字修饰的代码块称为静态代码块;
静态代码块的初始化内容只能执行一次,再次被实例化时将不会被执行;
静态代码块中只能初始化静态变量,不能放置普通变量;
我们可以看个例子:
public class Hello {
int num1;
int num2;
static int num3;
public Hello(){
num1 = 30;
System.out.println("通过构造方法给num1赋值");
}
{
num2 = 60;
System.out.println("通过初始化块给num2赋值");
}
static {
num3 = 90;
System.out.println("通过静态初始化块给num3赋值");
}
public static void main(String[] args){
Hello he = new Hello();
System.out.println("num1:" + he.num1);
System.out.println("num2:" + he.num2);
System.out.println("num3:" + num3);
Hello he1 = new Hello();
}
}
这个输出什么呢?可能输出和我们想象的有点相反,正确输出如下:
通过静态初始化块给num3赋值
通过初始化块给num2赋值
通过构造方法给num1赋值
num1:30
num2:60
num3:90
通过初始化块给num2赋值
通过构造方法给num1赋值
根据上面的输出结果可以看出,在实例化对象时静态初始化块最先执行,然后执行普通初始化块,最后才执行构造方法;并且由于静态初始化块只在类被加载时执行一次,所以第二次实例化对象时没有被执行,这就是静态初始化块的执行顺序和特点
最后总结一点静态和普通就好像是两个权限,普通的好像权限高一些,可以直接操作静态,但是静态要操作普通的则要复杂一些,需要实例化才可以
Java中static静态关键字的使用的更多相关文章
- php中static 静态关键字
一直依赖对于php中static关键字比较模糊,只是在单例模式中用过几次.上网查了查,没有找到很全的介绍,自己总结一下. 根据使用位置分为两部分 1.函数体中的静态变量 2.类中的静态属性和方法 1 ...
- Java之static静态关键字详解|final关键字详解
前言 在Java语言中,static表示"静态"的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法 ...
- php中static静态关键字的使用
php中除了常规类和方法的使用,访问控制之外,还有静态关键字static,静态变量可以是局部变量也可以是全局变量,当一个程序段执行完毕时,静态变量并没有消失,它依然存在于内存中,下次在定义时还是以前的 ...
- php中static静态关键字的使用方法和应用场景
php中除了常规类和方法的使用,访问控制之外,还有静态关键字static,静态变量可以是局部变量也可以是全局变量,当一个程序段执行完毕时,静态变量并没有消失,它依然存在于内存中,下次在定义时还是以前的 ...
- java中static关键字的作用
java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...
- 关于Java中的final关键字
Java中的final关键字是用来限制用户行为的,说白了,就是用来限制我们这些程序员的.final可以用来修饰:变量.方法.类. 1)Java final variable final用来修饰变量时, ...
- Java之Static静态修饰符详解
Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...
- Java中static、this、super、final的用法
一. static 请先看下面这段程序: public class Hello{public static void main(String[] args){//(1)System. ...
- Java中static的用法,初始化块
使用 Arrays 类操作 Java 中的数组语法: Arrays.sort(数组名); 可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该 ...
随机推荐
- Java算法-各种题目总结
1.排列计算 /*[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子 ...
- 解决Oracle忘记密码问题
在使用ORACLE的过程中,会出现各种各样的问题,各种各样的错误,其中ORA-12899就是前段时间我在将数据导入到我本地机器上的时候一直出现的问题.不过还好已经解决了这个问题,现在分享一下,解决方案 ...
- BZOJ-1934 Vote 善意的投票 最大流+建图
1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1551 Solved: 951 [Submit][S ...
- 【poj1745】 Divisibility
http://poj.org/problem?id=1745 (题目链接) 题意 给出n串数,可以在其两两之间添加+或-,判断是否存在某种方案使得出的表达式的答案可以整除k. Solution 水题一 ...
- Vijos1056 图形面积
描述 桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积. 格式 输入格式 输入第一行为一个数N(1≤N≤100),表示矩形的数量.下面N行,每行四个整数,分别表 ...
- Git Pull 避免用户名和密码方法
在开发中使用的版本控制器时git , 每次使用命令"git pull"从服务器获得最新代码时,都需要输入用户名和密码,这样浪费了大量的时间和热情,在此背景下,本文在网上找到解决版本 ...
- POJ1651Multiplication Puzzle(矩阵链乘变形)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8040 Accepted: ...
- HD1712ACboy needs your help(纯裸分组背包)
ACboy needs your help Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Nagios告警和监控主机安装介绍(三)
Nagios邮件告警 配置sendEmail 解压缩tar –zxvf sendEmail-v1.56.tar.gz cd sendEmail-v1.56 将可执行程序复制cp sendEmail / ...
- 初学structs2,表单验证简单补充
一.使用注解方式,跳过验证某个方法 由于在开发中,我们不需在请求每一个action类中的方法时都要走validate方法,那么我们可以在这些不需要验证的方法上加上@SkipValidation注解即可 ...