Java Keyword Static 学习记录
Static
Java编程思想:一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。
特点:随着类的加载而加载,随着类的销毁而销毁。
作用:可以修饰成员变量,代码块,方法,内部类以及导包操作。
1. 修饰成员变量
如果用static来修饰类成员变量,那么这个变量将会被该类所有实例对象所共享,我们从内存角度来解释一下,根据类加载机制,我们可以知道,静态成员变量是在类初始化的时候被初始化,被放在Jvm所开辟内存的方法区(堆)中,所有实例对象对这一变量的引用均指向这一内存地址,所以说是共享的。
/**
* @PackageName com.a.squirrel.staticdesc
* @Author: squirrel
* @Date: 2018/6/21 09:54
* @Description: static关键字解析辅助类
*/
public class StaticDescription {
private String name; // 常规变量 类实例化时初始化
public static String tmpTwo;// 静态变量 类初始化时初始化
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* @PackageName com.a.squirrel.staticdesc
* @Author: squirrel
* @Date: 2018/6/21 10:06
* @Description: 测试
*/
public class TestStaticDescription {
public static void main(String[] args) {
// 创建两个实例对象
final StaticDescription sd1 = new StaticDescription();
final StaticDescription sd2 = new StaticDescription();
// 对象sd1对变量tmpTwo 进行修改
sd1.tmpTwo = new String("i have changed by sd1");
System.out.println("sd1.tmpTwo:"+sd1.tmpTwo);
System.out.println("sd2.tmpTwo:"+sd2.tmpTwo);
// 查看结果
System.out.println(sd1.tmpTwo==sd2.tmpTwo);
sd1.setName(new String("hello"));
sd2.setName(new String("hello"));
System.out.println(sd1.getName()==sd2.getName());
}
}
看一下输出结果:

由上图打印结果可以看出静态变量是被实例对象sd1和sd2共享
2.修饰代码块
如果用static来修饰代码块,那么这段代码将会在类初始化的时候先于main方法执行,并且只会执行一次!
/**
* @PackageName com.a.squirrel.staticdesc
* @Author: squirrel
* @Date: 2018/6/21 10:06
* @Description: static关键字解析辅助类
*/
public class TestStaticDescription {
static {
System.out.println("i am static code block");// 静态代码块
}
public static void main(String[] args) {
System.out.println("i am main method");
}
}
看一下输出结果:

3. 修饰方法
static修饰的方法叫做静态方法,一般常见于工具类,最大的好处就是方便调用,不需要实例化对象。
4. 静态内部类
/**
* @PackageName com.a.squirrel.staticdesc
* @Author: squirrel
* @Date: 2018/6/21 10:06
* @Description: static关键字解析辅助类
*/
public class TestStaticDescription {
static {
System.out.println("i am static code block");// 外部类静态代码块
}
public TestStaticDescription() {
System.out.println("i am constructor");// 外部类构造器
}
public static void main(String[] args) {
System.out.println("i am main method");
System.out.println(InnerClass.tmp);// 调用内部类静态属性
}
private static class InnerClass{
private static int tmp = 0;// 静态内部类属性
static {
System.out.println("i am inner class code block");// 内部类静态代码块
}
public static void main(String[] args) {
System.out.println("i am inner class main method");
}
}
}
看一下结果:

对比上下两个图,我们可以知道,静态内部类在使用的时候才会被初始化。

静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建的时候会考虑采用静态内部类的设计。
静态内部类和非静态内部类的区别:
- 静态内部类可以有静态成员(方法,属性),非静态内部类则不能
- 静态内部类只能够访问外部类的静态成员,非静态内部类则可以访问外部类的所有成员(方法,属性)
- 实例化一个静态内部类,不依赖于外部类的实例,直接实例化内部类对象,实例化一个非静态内部类,需要先实例化外部类,然后才能实例化
5. 静态导包
将类的方法直接导入到当前类中,从而直接使用方法名即可调用类方法,这里不做过多说明。
注:个人总结,若有不对之处,欢迎批评指正,嘿嘿!
Java Keyword Static 学习记录的更多相关文章
- Java Keyword Synchronized 学习记录
Synchronized Java编程思想:每个对象都包含了一把锁(也叫作"监视器"),它自动成为对象的一部分,调用任何synchronized方法时,对象就会被锁定,不可再调用那 ...
- java 项目相关 学习记录
一位资深程序员大牛给予Java初学者的学习路线建议 [任何时期都可以好好看看] https://www.imooc.com/article/8993 https://www.jianshu.com/ ...
- JAVA 动态代理学习记录
打算用JAVA实现一个简单的RPC框架,看完RPC参考代码之后,感觉RPC的实现主要用到了两个方面的JAVA知识:网络通信和动态代理.因此,先补补动态代理的知识.---多看看代码中写的注释 参考:Ja ...
- [Hanani]JAVA大数相关学习记录
1.Basic remains 题目链接 涉及内容: |大数读入|大数模|大数进制读入时转化为十进制|大数输出时转化为其他进制输出| import java.io.*; import java.mat ...
- 转:java高并发学习记录-死锁,活锁,饥饿
死锁 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 为什么会产生死锁: ① 因为系统资源不足. ② 进程运行推进的顺序不合适. ③ ...
- java中static学习总结
<<java编程思想>>: 1.static方法就是没有this的方法. 2.在static方法内部非静态方法. 3.在没有创建对象的前提下,可以通过类本身来调用static修 ...
- Java 类引入 学习记录规整
之前觉得声明一个类,再把另一个包内的声明数值用第一个类打印出来就可以了(加入引入包类) 结果发现是不对的 看了看demo 得出正确结果 ImportTest 被运行 引入下面的Import类 ...
- java一周学习记录(2017/12/2)
姓名:Danny 日期:2017/12/2 周日 周一 周二 周三 周四 周五 周六 所花时间 120 150 190 150 180 28 ...
- 阿里巴巴java开发手册学习记录,php版
一.编程规约 (一)命名风格 1.目录使用小写+下划线 home,view,model,admin_view 2.类 UpperCamelCase PhpMailer方法 lowerCamelCase ...
随机推荐
- CSS - 设置placeholder样式
input::placeholder { font-size: 12px; font-family: Arial; letter-spacing: 5p ...
- JDBC面试知识点整理(温习用)
要面试,所以把之前的笔记整理一遍,嘻嘻,加油 JDBC编程 使用JDBC,java程序可以轻松地操作各种主流数据库,Oracle,MySQL,等,使用JDBC编写的程序不仅可以实现跨数据库,还具有跨平 ...
- es6的...
es6的... (1):函数rest参数和扩展 sum1(...sum){//传多个参数 let total=0; for( ...
- [BJDCTF2020]The mystery of ip
0x00 知识点 SSTI模板注入: 之前也写过: https://www.cnblogs.com/wangtanzhi/p/12238779.html SSTI模板注入: 模板注入涉及的是服务端We ...
- NIO前奏之Path、Files、AsynchronousFileChannel
NIO前奏之Path.Files.AsynchronousFileChannel Java 1.4加入了nio包,Java 1.7 加入了真正的AIO(异步IO),AsynchronousFile ...
- 【pwnable.kr】col
pwnable从入门到放弃第二题, ssh col@pwnable.kr -p2222 (pw:guest) 同样是登录,然后看到了col.c.col.flag三个文件,读一下col.c #inclu ...
- hdu3359 Kind of a Blur
因为变化出来的是平均数,那么就可以对每一个变化出来的列方程,直接高斯消元就行了. #include<bits/stdc++.h> #define N 100005 #define LL l ...
- vagrant 学习笔记
之所以学习他是因为最近换了电脑 又要重新搭环境 很烦躁然后就有了然后 1.先安装 virtualbox2.安装 vagrant3.安装xshell4.重启5.下载系统镜像 (可以去vagrant官网 ...
- Linux - 安装 dotnet core 环境
Linux - 安装 dotnet core 环境 系统环境:CentOS7 官方安装指导 https://www.microsoft.com/net/learn/get-started/linux ...
- linux下的hashpump安装及使用
hashpump是linux上的一个进行hash长度拓展攻击的工具,安装过程如下: git clone https://github.com/bwall/HashPump apt-get instal ...