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. cf 398B. Painting The Wall

    23333,还是不会..%%%http://hzwer.com/6276.html #include <bits/stdc++.h> #define LL long long #defin ...

  2. 153-PHP htmlentities函数

    <?php //定义一个HTML代码字符串 $str=<<<HTM <a href=#><b><i>到一个网址的链接</i>&l ...

  3. 071-PHP数组合并

    <?php $arr1=array('a','b','c'); //定义一个数组 echo '数组$arr1的信息:<br />'; print_r($arr1); //输出数组信息 ...

  4. 第三节MapStruct翻译--Defining a mapper

    第三节MapStruct--Defining a mapper 在这一章节你将学到如何用mapstruct和它的一些必要的操作选项来定义一个bean mapper. 3.1 Basic mapping ...

  5. Java 逆序打印链表

    递归 package cookie; public class PrintListReversal { public void reversalOut(Node head) { if (head != ...

  6. 好记性不如烂笔头--shell参数及shell判断if系列

    $0 当前脚本的文件名$n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2$# 传递给脚本或函数的参数个数$* 传递给脚本或函数的所有参数$@ 传递给 ...

  7. 压测工具siege和wrk

    siege压测工具 安装: wget http://download.joedog.org/siege/siege-3.0.8.tar.gz cd siege-3.0.8 ./configure ma ...

  8. Bulma CSS - 响应式

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是一 ...

  9. Linux预习第三章节《重定向与管道符》20200219

  10. HDU 5455:Fang Fang 查cff个数

    Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...