Java: static 修饰下的静态变量、静态方法、静态代码块、静态类
1、静态变量
对于在类中用static修饰的静态变量(例如:static String str;),只要有两个特性:
1、无需实例化对象,可以直接调用:
public class Test2 {
String str1 = "aaa";
static String str2 = "bbb";
public static void main(String[] args)
{
//如果不是静态变量,这样访问:
String str1 = new Test2().str1; //需要实例化
//对于静态变量 str2:
String str2 = Test2.str2; //无需实例化 Test2
}
}
2、静态变量为对象中 “共享” 的变量,在编译时由系统分配一块内存空间,直到程序停止运行才会释放(这也是为什么可以通不进行实例化而可以直接调用),对于同一类的几个不同的实例化对象,类中的静态变量对每个实例化对象都是相同的:
public class Test2 {
static String str2 = "初始化";
public Test2() {
str2 = "无参构造";
}
public Test2(String str2) {
this.str2 = str2;
}
public static void main(String[] args)
{
Test2 test2_1 = new Test2();
Test2 test2_2 = new Test2("带参构造");
System.out.println(test2_1.str2+" "+test2_2.str2);
}
}
main 函数输出结果为: 带参构造 带参构造
可见,静态变量对所有的实例化对象都是相同的,以最后一次修改为结果。
2、静态方法
对于类中的静态方法,最大的优点依然是无需实例化对象,可以通过 “类名”+ “ . ” + “方法” 来调用(还是因为系统会为静态方法分配一个固定的内存空间)。要知道,创建一个对象是极其耗费资源的。。。。
此外,静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
3、静态代码块
基本语法:
static
{
//此处写代码
}
当一个类中定义了 静态代码块,当类被第一次加载到内存中,静态代码块会被自动执行一次(无需调用),以后再也不会执行。拿一个很实际的例子来说,在进行 JDBC 编程,连接数据库时,获取资源文件解析器对象(ResourceBundle)以及加载驱动(Class.forName(driver)) 的操作都是很耗时的,但是也只是需要执行一次即可,那么就可以写到静态代码块中:
//描述在mysql驱动jar包中,核心类是哪个,其完整路径是什么样的----驱动串
private static String driver=null;
//描述数据库所在的位置,数据库的名称--- 连接串
private static String url=null;
//用户名
private static String userName=null;
//密码
private static String password=null;
static
{
try
{
System.out.println("linklinklink");
//获取资源文件解析器对象
ResourceBundle bundle=ResourceBundle.getBundle("DBOptions");
//通过解析器对象,从资源文件,获取相关信息
/*
* driver,url,userName,password 都是开头定义的静态变量,从文件中读取其信息
*/
driver=bundle.getString("DRIVER");
url=bundle.getString("URL");
userName=bundle.getString("USERNAME");
password=bundle.getString("PASSWORD");
//加载驱动 --- new com.mysql.jdbc.Driver()
Class.forName(driver);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
这样,会节省很多因为重复操作造成的资源浪费!!
4、静态类
静态类一般又叫 “静态内部类” , 可以看出,他是一个嵌套类。不予许在外部类用static 修饰,编译不会通过。
主要对比下 静态内部类 与 普通内部类 的区别:
内部类: 内部类拥有普通类的所有特性 。内部类可以访问其外部类的成员变量,属性,方法,其它内部类
静态内部类:
1、只有静态内部类才能拥有静态成员,普通内部类只能定义普通成员
2、静态类跟静态方法一样,只能访问其外部类的静态成员
3、如果在外部类的静态方法中访问内部类,这时候只能访问静态内部类
总的来说,静态的产生,还是为了提高开发效率,避免不必要的重复操作也资源消耗,例如定义的静态变量,有一天要换一个值,不必把所有调用他的地方都换一遍,换一个地方便 “牵一发而动全身” 了。
如有不当之处,请谅解并欢迎批评指正,不甚感激。
- (Head First 设计模式)学习笔记(3) --装饰者模式(StarBuzz咖啡店实例)
- 我的Js代码-按钮按下时判断是否选择了最后一行,给出提示
- (Head First 设计模式)学习笔记(2) --观察者模式(气象站实例)
- Spring Boot使用HandlerInterceptorAdapter和WebMvcConfigurerAdapter实现原始的登录验证
- 一条视频获C+融资 两个域名神助攻
- ExtJs与WCF交互:生成树
- JavaScript大略
- 加点的心得
- Markdown
- 介绍linux下利用编译bash设置root账号共用的权限审计设置
- 分享一例脚本发版和tomcat重启脚本
- 2018年小程序的红利趋势预测,或许你将成为下个富翁
- 分布式监控系统Zabbix-3.0.3-完整安装记录(5)-邮件报警部署
- label自定义的惨痛教训
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 微信小程序转发朋友圈详解
- Error: Protocol error, got "H" as reply type byte
- 树莓派基础实验33:TCRT5000红外循迹传感器实验
- 10W个Java对象有多大
- 一次线程池引发的线上故障分析
- dubbo 启动Failed to save registry store file报错
- 大数据的列式存储格式:Parquet
- springBoot 入门(六)—— 整合Spring框架开启自带的任务调度器执行任务(注解方式)
- java字节流入门(缓冲输出流)
- EsotericSoftware Kryo —— 官方(1)
- Java的I/O类库的基本架构一句话介绍
- 树莓派综合项目1:智能温度测量系统实验
- 一句话ListenableFuture简介
- Google Guava Cache 使用
- Linux下安装maven3.6.2遇到的问题