静态变量和静态方法

static关键字的基本用法:

1.修饰变量:被static修饰的变量属于类变量,可以用类名.变量名来引用,而不用直接new一个对象来引用。

2.修饰方法:被static修饰的方法属于类方法,可以用类名.方法名来引用,而不用直接new一个对象来引用。

被static修饰的变量和方法是属于类所有的,是类的静态资源,而静态资源是类初始化的时候被加载的,为类的所有实例所共享,非静态资源是new一个对象的时候被加载的。类的初始化早于类的new,比如Class.forName(“xxx”)方法,就是初始化了一个类,但是并没有new它,只是加载这个类的静态资源罢了。所以对于静态资源来说,它不知道有哪些非静态资源,对于非静态资源来说,由于它是在类初始化加载静态资源之后new对象的时候加载的,所以它知道有哪些静态资源。因此,可以回答以下问题:

静态方法能不能引用非静态资源?非静态方法里面能不能引用静态资源?

1、静态方法能不能引用非静态资源(包括变量和方法)?不能,非静态资源是new对象的时候产生的,对于类初始化后就存在的静态资源来说,根本不认识它。

2、非静态方法里面能不能引用静态资源(包括变量和方法)?可以,非静态方法就是是new之后才产生的,那么在它之前被加载的类的静态资源它都认识。

 public class TestController {

     private int num;
private static int num2; public static void main(String[] args) {
num = 1;//报错 Non-static field 'num' cannot be referenced from a static context
num2 = 2;
} public void noneStaticMethod(){
num = 1;
num2 = 2;
} }

静态代码块

静态代码块也是static的重要应用之一,和静态变量、静态方法一样,静态代码块里面的代码只执行一次,且只在初始化类的时候执行

1.举例说明为什么使用静态代码块?

以下程序判断一个人的出生日期是否在婴儿潮之内

 public class Person {
private Date birthDate; boolean isBabyBoom() throws ParseException {
Date startBabyBoomDate = DateUtil.parse("1946-01-01");
Date endBabyBoomDate = DateUtil.parse("1964-12-31");
return birthDate.compareTo(startBabyBoomDate) >= 0 && birthDate.compareTo(endBabyBoomDate) <= 0;
} public static void main(String[] args) throws ParseException {
Person person = new Person();
person.birthDate = DateUtil.parse("1960-01-10");
boolean babyBoom = person.isBabyBoom();
System.out.println(babyBoom);
} }

结果:

true

但是每次调用isBabyBoom()这个方法的时候,都会new出两个对象 startBabyBoomDate ,和 endBabyBoomDate ,造成内存的浪费。而将这两个对象放入静态代码块中的话,只会在类加载的时候执行一次,为所有的实例共享。

 public class Person {
private Date birthDate;
private static Date startBabyBoomDate,endBabyBoomDate; static{
try {
startBabyBoomDate = DateUtil.parse("1946-01-01");
endBabyBoomDate = DateUtil.parse("1964-12-31");
} catch (ParseException e) {
e.printStackTrace();
}
} boolean isBabyBoom() throws ParseException {
return birthDate.compareTo(startBabyBoomDate) >= 0 && birthDate.compareTo(endBabyBoomDate) <= 0;
} public static void main(String[] args) throws ParseException {
Person person = new Person();
person.birthDate = DateUtil.parse("1960-01-10");
boolean babyBoom = person.isBabyBoom();
System.out.println(babyBoom);
person.birthDate = DateUtil.parse("1989-01-10");
boolean babyBoom1 = person.isBabyBoom();
System.out.println(babyBoom1);
} }

结果:

true
false

因此,一些操作只需要在初始化的时候执行一次的话,就可以放在静态代码块中。

关于static代码块的执行顺序:

1.静态资源的加载顺序是严格按照静态资源的定义顺序来加载的。

2.有继承关系下,静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次。

举例:

//父类
public class Person {
static{
System.out.println("父类Person 静态代码块1");
}
static{
System.out.println("父类Person 静态代码块2");
}
public Person(){
System.out.println("父类Person 构造器");
}
}
//子类
public class Student extends Person{
static{
System.out.println("子类Student 静态代码块");
} public Student(){
System.out.println("子类Student 构造器");
}
}
//测试
public class Test {
public static void main(String[] args){
new Student();
new Student();
}
}

结果:

父类Person 静态代码块1
父类Person 静态代码块2
子类Student 静态代码块
父类Person 构造器
子类Student 构造器
父类Person 构造器
子类Student 构造器

由此可见,无论创建多少对象,静态代码块只执行一次,且按照定义的顺序执行。

static修饰类

这个用得相对比前面的用法少多了,static一般情况下来说是不可以修饰类的,如果static要修饰一个类,说明这个类是一个静态内部类(注意static只能修饰一个内部类),也就是匿名内部类。像线程池ThreadPoolExecutor中的四种拒绝机制CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy就是静态内部类。静态内部类相关内容会在写内部类的时候专门讲到。

静态导包

import static是JDK1.5之后的新特性,这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名.资源名,可以直接使用资源名。注意一下,import static必须这么写,而不能写成static import。

举例:

 package com.dajia.test;

 import static java.lang.Math.*;

 public class Test {
public static void main(String[] args){
System.out.println(round(3.85));
}
}

但是这样降低了代码的可读性,如非要求,个人不会使用这种方式。

参考资料:

https://www.cnblogs.com/xrq730/p/4820992.html

https://www.cnblogs.com/dolphin0520/p/3799052.html

static关键字的用法的更多相关文章

  1. C/C++中static关键字的用法

    1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...

  2. c++中static关键字的用法总结

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  3. C语言中static关键字的用法

    C记得还是大一时学的,现在觉得好久没用了,又捧起来看看.今天刚看到有关static关键字,仔细地看了一遍<C和指针>这本书中的解释,现在觉得清楚多了. 首先,我们将static关键字,修饰 ...

  4. Java中的static关键字的用法

    1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...

  5. Java基础之static关键字的用法

    Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例.        静态(static)可以是: 变量 ...

  6. static关键字的用法小结

    static:是一个修饰符,用于修饰成员(成员变量,成员函数). 当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用,写法:类名.静态成员 static特点: 1.随着 ...

  7. C++中static关键字的用法

    运行一个完整的程序.我们可将整个存储区分为四块: (1)栈区:就比如局部变量,对应的函数参数等这些,调用完之后相应的内存会自己释放掉,很让人省心. (2)堆区:堆来堆去的.得要人动手.所以得我们自己手 ...

  8. 关于Java中static关键字的用法以及从内存角度解析

    在Java中,static可以用来修饰成员变量和成员方法. 修饰成员变量,称为静态成员方法 修饰静态方法,称为静态成员方法 搞清楚用法和区别之前,先搞清static声明的变量和普通非静态变量在内存的分 ...

  9. static关键字用法

    java中static关键字可用于修饰: 1.属性:表示该属性变量在类被加载时即被创建并初始化,类加载过程只进行一次,因此静态变量也只被创建一次 2.方法:静态方法为类的公有方法,可直接用‘类名.方法 ...

随机推荐

  1. Flask-SQLAlchemy常用操作

    一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...

  2. mysql 性能优化思路 - mysqldumpslow /tmp/mysql-slow.log 字符集 utf-8 create database

    提高MySQL服务的性能,响应速度: 1.替换有问题的硬件:内存,CPU,磁盘 2.服务的配置参数的配置 3.SQL的优化 .服务参数的配置: 1.1 连接数,连接超时: max_connection ...

  3. 支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理

    先上一张本文所描述的适用场景图 分布式场景,共3台server: 前端Server Order App Server Warehouse App Server 功能: 前端Server可以不停的发送C ...

  4. 【C# 复习总结】类、继承和接口

    1 类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指 ...

  5. React组件重构:嵌套+继承 与 高阶组件

    前言 在最近做的一个react项目中,遇到了一个比较典型的需要重构的场景:提取两个组件中共同的部分. 最开始通过使用嵌套组件和继承的方式完成了这次重构. 但是后来又用高阶组件重新写了一遍,发现更好一点 ...

  6. 算法题:合并N个长度为L的有序数组为一个有序数组(JAVA实现)

    昨天面试被问到这道算法题,一时没有回答上来,今天思考了一下,参阅了网上的教程,做了一个JAVA版本的实现. 方案一: 新建一个N*L的数组,将原始数组拼接存放在这个大数组中,再调用Arrays.sor ...

  7. 如何在C#中使用Dapper(译)

    前言: 对象关系映射(ORM)已经被使用了很长时间,以解决在编程过程中对象模型与数据模型在关系数据库中不匹配的问题. Dapper是由Stack OverFlow团队开发的开源的,轻量级的ORM.相比 ...

  8. 我的微信小程序第一篇(入门)

    前言 微信小程序出来已经有一段时间了,已经有很多大牛都写过相关教程了,那么我为啥还要写这篇文章呢?其实仅仅是个人对微信开发的一个兴趣吧,觉得是个很有意思的事情,后面有时间可能会发更多关于小程序的文章, ...

  9. 这款APP太像微信 腾讯起诉索赔1000万

    去年8月,“币应”(inChat)APP上线,号称是一款原创的区块链加密通讯工具,而界面与微信极为相似,图标是白配绿色调,内部界面几乎一模一样,通讯录.朋友圈的界面完全相同.里面的小游戏,也从微信拿来 ...

  10. 三次握手复习TCP

    临近下班,突然想起三次握手的概念有点模糊. 大学时候的<计算机网络>是英语版的,那时候学习迷迷糊糊的.大概记得一个模型罢了. 幸好,大学基本所有的书都卖了,就是计算机网络没卖.待会回去看看 ...