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. cf749 D. Leaving Auction

    #include<bits/stdc++.h> #define lowbit(x) x&(-x) #define LL long long #define N 200005 #de ...

  2. [LeetCode] 933. Number of Recent Calls 最近的调用次数

    Write a class RecentCounter to count recent requests. It has only one method: ping(int t), where t r ...

  3. Swift 元组 Tuple

    let infoArray:[Any] = ["jack",18,1.88] let infoName=infoArray[0] as!String //此处为Any类型强转为St ...

  4. maven详解之仓库

    在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依赖和插件的地方) 任何的 ...

  5. 留学Essay写作中常见的两类要求词盘点

    写essay的时候,我们会常常因为各式各样的要求词而头疼:discuss,describing,evaluate,explain,等等,他们之间有何区别?如果你在思考这个问题,那么这篇文章就是为你写的 ...

  6. Oozie笔记

    简介 Oozie 是用于 Hadoop 平台的开源的工作流调度引擎. 用于管理 Hadoop 属于web应用程序, 由 Oozie client 和 Oozie Server 两个组件构成. Oozi ...

  7. opencv目录(转)

    github:https://github.com/opencv/opencv OpenCV 3 的源代码文件夹: 3rdparty/: 包含第三方库,如用视频解码用的 ffmpeg.jpg.png. ...

  8. EUI库 - 9 - 数据集合 - 数据容器

      DataGroup 设置一个数据源 自动创建内部所需的对象 来完成数据展示   还要设置单条数据的模板  叫ItemRenderer   继承关系 eui.List  eui.ListBase e ...

  9. jQuery网页定时弹出广告

    1.下载jQuery,并导入:https://blog.csdn.net/weixin_44718300/article/details/88746796 2.代码实现: <!DOCTYPE h ...

  10. Maven工程配置依赖

    1.下载 安装 官网下载maven :http://maven.apache.org/download.cgi ,下载时候注意版本,IDEA旧版本如我用的2017在安装Maven时可能会报错,此时别下 ...