java中static_认识java中的static
作者的废话:emm,早就想开始自己的博客生涯,不过只要一打开电脑,映入眼帘的就是一大堆杂乱的笔记,对于整理它们我是提不起丝毫的兴趣,奈何被生活所迫,只有开始我的第一篇杂文这样子来维持生活
注:下面代码中的 中文名称 纯属为了方便理解,实际开发中一般以驼峰命名法
再注:作者(也就是我)使用的jdk为1.8
如:String helloWorld = "你们真棒,若各位发现错误或者作者理解错误的地方,就联系或评论让我们一起变更好吧";
零、static修饰变量
0.0、static修饰的变量称为静态变量
0.1、static不能修饰局部变量
0.2、静态变量被所有对象共享
0.3、同一静态变量在内存中地址唯一,如下:
静态变量:
public static TestEntity 我是静态变量;
测试:
Test
测试结果:
虽然是从不同的对象来调用,但是它们引用着同一个内存地址
0.4、被static修饰的变量只有在类被加载时才被初始化(注:非静态变量是当对象被创建时才初始化)
扩展:内存分区(引用自 博客园作者:吃鱼尾的咩——java中静态变量在内存中的位置 - 吃鱼尾的咩 - 博客园)
而内存分为四个区:stack segment,heap segment,data segment,code segment;
stack 区存放函数参数和局部变量;heap 区存放对象;data 区存放static 的变量或者字符串常量
code 区存放类中的 方法。
一、static修饰方法
1.0、被static修饰的方法称为静态方法
1.1、在静态方法内部无this
1.2、在静态方法内调用非静态方法或者非静态变量,如下:
RunTest runTest = new RunTest();
runTest.我是非静态变量 = "我的电耗子比亚缩还快乐";
runTest.我是非静方法();
注:非静态方法或变量依赖于对象调用
1.3、在本类中可直接调用静态方法,在其他类中调用时需用 类名.方法 方式调用
public static void 调用静态方法() {
被调用的静态方法();
}
public static void 被调用的静态方法() {
}
1.4、我们都知道main方法是显示的用static修饰,那构造器是否是隐式的静态方法呢?
我谈一下我的理解:静态方法无this不能直接调用其他非静态,而构造器可以调用。故我认为构造器不是静态方法。
大家感兴趣可以再次去深究
扩展:
简谈new与构造器:new 构造器();
new:此表达式表示对象的创建。
构造器:对创建的对象进行初始化。
使用new 构造器();的方式创建对象,我理解为保证创建与初始化同时进行。
二、static修饰代码块
2.0、在类被加载时进行一次性执行,一个类中可有多个静态代码块,按静态代码块顺序执行
2.1、可用于进行类加载时的初始化,以达到避免浪费空间、提升程序性能的作用
如下:
private static BigDecimal fiveThousand;
static {
fiveThousand = new BigDecimal(5000);
}
public static boolean lessFiveThousand(BigDecimal wage) {
return wage.compareTo(fiveThousand) == -1 ? true:false;
}
不用每次调用此方法时都new一个BigDecimal对象(此处只是举例)
可能有朋友问为什么不像下面这样做:(我想说的是当实际开发中,为项目编写属于项目本身的工具类时当有许多需要类加载时初始化的变量时放到一个静态类中方便查看与管理)
private static BigDecimal fiveThousand=new BigDecimal(5000);
三、static修饰内部类
3.0、下面举一个effective java中的建造者模式中关于静态内部类的用法:
package lyy;
public class PasswordManager {
private final String id;
private final String account;
private final String password;
private final String salt;
private PasswordManager(Builder b){
id = b.id;
account = b.account;
password = b.password;
salt = b.salt;
}
public static class Builder{
private String id;
private String account;
private String password;
private String salt;
public Builder id(String val) {
id = val;
return this;
}
public Builder account(String val) {
account = val;
return this;
}
public Builder password(String val) {
password = val;
return this;
}
public Builder salt(String val) {
salt = val;
return this;
}
public PasswordManager build() {
return new PasswordManager(this);
}
}
}
此处使用静态内部类Builder的build()方法为PasswordManager创建实例
注:return this;只是为了链式调用
new PasswordManager.Builder().account("22").password("2233").salt("lyy").build()
对于静态内部类的用法作者接触较少,老歌们请允许我为广大程序员呼吁:
留下你们宝贵的经验财富吧。留下你们宝贵的经验财富吧。留下你们宝贵的经验财富吧。
四、static修饰import
4.0、静态导包我理解的好处就是节省代码(粗鄙的见解,哈哈)
导包:import static java.lang.System.*; 或者import static java.lang.System.out;
使用:out.println("lyy");
作者结语:本想在最后分享一些开发经验,奈何我没有控制住自己....(别多想,肚子饭 要吃饿<._.>)
谈谈经验(谈一点和static相关的):
我相信大家都知道transient修饰符是为了不序列化,那你要不要试试static呢
(建议实际开发或作业中别这么干,这会共享的哟亲,只是作为一个扩充知识点)?
谈到静态方法,不知道大家在使用spring开发项目时是否遇到循环引用的情况,大家若遇到此情况如何处理呢?
是否是利用注解@JsonIgnoreProperties来引用目标对象使它不序列化呢
如果你把此对象的get方法加上Static你会发现它竟然没有循环引用了
(建议最好别这么干,目前我并没有想出这样做的缺陷在哪儿,望大家指教。只是作为一个扩充知识点)
若你使用lombok或者希望ide自动帮我们生成get/set的话请往下看:
不知你们可否遇到当变量类型为boolean且变量名为isxxx的时候自动的get/set名如下:
protected boolean isNot;
public boolean isNot() {
return isNot;
}
public void setNot(boolean isNot) {
this.isNot = isNot;
}
具体原因,额....等我翻翻笔记,当我打开Typora一看,默默关了敲下后面的字:大哥大姐们东西在下面给你们了拿去用吧
百度一下,你就知道www.baidu.com
(排名不分先后)
Googlewww.google.com
(哈哈,笔记太乱:当然可能有朋友推荐我用搜索,哼我可以认真且负责的告诉你,我搜了,没 搜 到!!)
对于此我的解决办法为把基本类型boolean改为包装类Boolean就好了,不信你看(不要让我发现你怀疑是我手改的哟>_<坚决没有,不信你试):
protected Boolean isNot;
public Boolean getIsNot() {
return isNot;
}
public void setIsNot(Boolean isNot) {
this.isNot = isNot;
}
java中static_认识java中的static相关推荐
- java main方法static_在java中为什么要把main方法定义为一个static方法?
我们知道,在C/C++当中,这个main方法并不是属于某一个类的,它是一个全局的方法,所以当我们执行的时候,c++编译器很容易的就能找到这个main方法,然而当我们执行一个java程序的时候,因为ja ...
- java中public static_对java中public、static的理解
首先是public 在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes ...
- java中静态代码块的用法 static用法详解(转)
(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程 ...
- java中main方法前的public static void及其后面的(String[] args)【笔记自用】
为什么Java的main方法必须是public static void? 一. void 如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错. 找到一种可理 ...
- java final内存机制_Java中的内存处理机制和final、static、final static总结
装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JV ...
- java中静态代码块的用法 static用法详解
(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程 ...
- c++ main函数调用 类中的枚举_为什么 Java 的 main 方法必须是 public static void?
点击上方 Java进阶之道,选择 设为星标 优质文章,及时送达 为什么 main 方法是静态的(static)? 为什么main方法是公有的(public) ? 为什么 main 方法没有返回值(Vo ...
- 【Java】:类变量、类方法(static在类中的用法)及main函数细节
前言 经过一个多月的学习,终于进入了学习Java的第二阶段,本篇博客主要介绍Java面向对象高级部分中 类变量.类方法 的使用,以及 main函数语法 剖析,主要设计 static关键字 在类中的使 ...
- java静态变量特点_Java中static的特点
前两天面试时被问到静态的特点,当时回答地不是很好,现在来总结一下 在了解某样东西的时候我们通常会从它是什么,为什么,和怎么样在三方面来衡量,对于java中的static,我们也这样讨论下,要明确以下几 ...
最新文章
- SpringCloud Alibaba 微服务架构版本说明
- FORK()子进程对父进程打开的文件描述符的处理
- 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
- 艰难的这年,程序员的未来在哪里?
- 桌面鼠标手写输入法_「桌面分享」工作娱乐两不误,花费7万打造的桌面都有些啥?...
- GraphQL入门之GraphQL查询的规范
- .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记
- Oracle入门(十三A1)之替换变量,变量名,变量名
- VC++ 6.0如何创建与调用动态链接库
- CAD中 OLE不能旋转_AutoCAD小秘密042:光栅图像和OLE图像,究竟如何选择
- 给大家推荐几个查找芯片手册的网址,超级全建议收藏
- 服务器HBA品牌、驱动和固件版本核查
- 冬瓜哥原创装b文 :《觉醒》
- crontab 每天凌晨12点定时器_crontab命令定时备份执行脚本
- storm apache java_Apache Storm 示例 Java 拓扑 - Azure HDInsight | Microsoft Docs
- PTA数据结构第二章线性表
- Centos7安装docker并更改阿里云下载镜像地址(附带windows10安装docker教程)
- windows双系统如何删除ubuntu系统并重装
- 0基础如何学习安卓开发
- oc 基础教程 读书笔记
热门文章
- puppet之用户管理
- oracle数据库数据表误删后,恢复数据处理方式
- Codeforces Round #552 (Div. 3) Editorial 1154C - Gourmet Cat
- ubuntu下python安装pandas和numpy等依赖库版本不兼容的问题RuntimeWarning: numpy.dtype size changed...
- wttr.in -- a magical website
- 【转载】ubuntu换源
- Android-图像识别项目OpenCV(4):开发思路以及问题
- 在线JSON美化格式化工具
- 网件rax40可以刷梅林_抢先一步体验WIFI6—网件RAX40 WIFI6路由器体验记
- java String补足