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");
}
}
}

看一下结果:



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



静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建的时候会考虑采用静态内部类的设计。

静态内部类和非静态内部类的区别:

  1. 静态内部类可以有静态成员(方法,属性),非静态内部类则不能
  2. 静态内部类只能够访问外部类的静态成员,非静态内部类则可以访问外部类的所有成员(方法,属性)
  3. 实例化一个静态内部类,不依赖于外部类的实例,直接实例化内部类对象,实例化一个非静态内部类,需要先实例化外部类,然后才能实例化

5. 静态导包

将类的方法直接导入到当前类中,从而直接使用方法名即可调用类方法,这里不做过多说明。

注:个人总结,若有不对之处,欢迎批评指正,嘿嘿!

Java Keyword Static 学习记录的更多相关文章

  1. Java Keyword Synchronized 学习记录

    Synchronized Java编程思想:每个对象都包含了一把锁(也叫作"监视器"),它自动成为对象的一部分,调用任何synchronized方法时,对象就会被锁定,不可再调用那 ...

  2. java 项目相关 学习记录

    一位资深程序员大牛给予Java初学者的学习路线建议  [任何时期都可以好好看看] https://www.imooc.com/article/8993 https://www.jianshu.com/ ...

  3. JAVA 动态代理学习记录

    打算用JAVA实现一个简单的RPC框架,看完RPC参考代码之后,感觉RPC的实现主要用到了两个方面的JAVA知识:网络通信和动态代理.因此,先补补动态代理的知识.---多看看代码中写的注释 参考:Ja ...

  4. [Hanani]JAVA大数相关学习记录

    1.Basic remains 题目链接 涉及内容: |大数读入|大数模|大数进制读入时转化为十进制|大数输出时转化为其他进制输出| import java.io.*; import java.mat ...

  5. 转:java高并发学习记录-死锁,活锁,饥饿

    死锁 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 为什么会产生死锁: ① 因为系统资源不足. ② 进程运行推进的顺序不合适.    ③ ...

  6. java中static学习总结

    <<java编程思想>>: 1.static方法就是没有this的方法. 2.在static方法内部非静态方法. 3.在没有创建对象的前提下,可以通过类本身来调用static修 ...

  7. Java 类引入 学习记录规整

    之前觉得声明一个类,再把另一个包内的声明数值用第一个类打印出来就可以了(加入引入包类) 结果发现是不对的 看了看demo  得出正确结果    ImportTest 被运行 引入下面的Import类 ...

  8. java一周学习记录(2017/12/2)

    姓名:Danny                               日期:2017/12/2 周日 周一 周二 周三 周四 周五 周六 所花时间 120 150 190 150 180 28 ...

  9. 阿里巴巴java开发手册学习记录,php版

    一.编程规约 (一)命名风格 1.目录使用小写+下划线 home,view,model,admin_view 2.类 UpperCamelCase PhpMailer方法 lowerCamelCase ...

随机推荐

  1. idea开发springboot 的mysql数据库连接问题

    今天在家用idea进行springboot开发,前面一些坑相对避免了,但是到数据库这块总是连接不上,报错主要是: Access denied for user 'root'@'localhost' ( ...

  2. Python自学之路

    2020年春节,受新型冠状病毒影响,整个春节假期,全国人民都在恐慌之中,为了避免大家上班相互传染,公司号召国家政策,开始上班日期延迟,在家呆的实在太无聊,突然感觉自己不能浪费这美好的时光,决定学习Py ...

  3. 九十五、SAP中查看自定义包的所有模块,对象,函数主,事务等

    一.输入SE80 二.选择包,再查下Z* 三.可以看到,查下出来的包 四.可以看到我们想要的内容了

  4. 074-PHP数组元素相乘

    <?php $arr1=array(3,4,5,6,'7',TRUE); //等价于 3*4*5*6*7*1=2520 $arr2=array(3,4,5,6,'7','hello'); //等 ...

  5. vue学习(十二)vue全家桶 Vue-router&Vuex

    一 vue-router的安装 二 vue-router的基本使用 三 命名路由 四 动态路由的匹配和路由组件的复用 一 vue-router的安装 NPM npm install vue-route ...

  6. phi

    给定 \(T\) 个正整数 \(n\) ,对于每个 \(n\) ,输出做小的 \(m\) ,使得 \(\phi (m)\ge n\). 思路1:搞个线性欧拉函数筛,后缀最大值,二分查找 思路2:直接求 ...

  7. 找《飘》 中最常用的N个单词。

    找<飘> 中最常用的N个单词. 1,题目:输出单个文件(<飘> 英文版)中的前 N 个最常出现的英语单词,并将结果输入到文本文件中. 2,设计思路: 1),按行依次读取文件并按 ...

  8. UVA - 1612 Guess (猜名次)(贪心)

    题意:有n(n<=16384)位选手参加编程比赛.比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交得越早,预得分越大).接下来是系统测试.如果某 ...

  9. 剑指offer_1.18_Day_2

    怠惰怠惰,好好练练了要 二维数组中查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 ...

  10. Python Learning Day9

    Scrapy爬虫框架 发送请求 ---> 获取响应数据 ---> 解析数据 ---> 保存数据 Scarpy框架介绍 1.引擎(EGINE) 引擎负责控制系统所有组件之间的数据流,并 ...