static 关键字分析
在java中static 关键字用途很广,可以修饰成员变量 方法 甚至类(静态内部类),这里不分析static 修饰类
- static修饰的内容的运行顺序
java的程序执行之前有一个类的加载的过程,在这个过程中将会执行static修饰的代码,重上往下执行,所以说static修饰的成员变量(顺便说一下,static不能用来修饰局部变量,java语法规定,没有为什么)或者方法会在对象还没有被实例化的时候将会被执行
- static 访问限制
可以重上面推导以下规律:statc修饰的变量和方法可以访问static修饰的变量和方法但不允许访问 非static修饰的变量和方法,非static修饰的变量和方法可以访问static修饰的变量和方法和非static修饰的变量和方法
对于一行规律不难理解,static修饰的变量和方法在类的加载时就已经被定义了,而此时的非static 修饰的变量和方法还没有被对象的实例化所创建,所以就有了上述的访问界限
- static定义的方法中不能使用this
this是本类对象的引用,可以表示正在调用的对象,用this.属性变量可以用来访问成员属性变量,但在static定义的方法中不允许用this访问成员属性变量,在我们前面的分析中可以知道static定义的方法在类的加载时就会执行,而在这个过程中,对象还没有被实例化,此时的this没有意义
对static的实际意义分析
static表示“全局”或者“静态”的意思,用该关键字修饰的变量和方法,将不单独属于某个对象,而是被所以的对象共享
这样的方法一般称为静态变量(类变量)或者静态方法(类方法),它由对象层级上升为类层级,可有类名.直接访问(推荐该方式),他将不依赖于任何对象,因此static方法必须被实现,
举例说明
描述一个图书的类这些书的出版社相同
//定义一个描述图书的类
class Book{
private String title;//标题
private String author;//作者
private double price;//价格
String pub="沐言友拓出版社";//出版社
public Book(String title,String author,double price){
this.title=title;
this.author=author;
this.price=price;
}
//得到图书的信息
public String getInfo(){
return"出版社:"+this.pub+"图书标题:"+this.title+"作者:"+this.author+"价格"+this.price;
}
}
public class BookTest{
public static void main(String[]args){
Book book1=new Book("java重入门到项目实战","李兴华",99.2);
Book book2=new Book("spring开发实战","李兴华",98.3);
System.out.println(book1.getInfo());
System.out.println(book2.getInfo());
}
}
运行结果

对该类的对象的内存结构进行分析

该程序来说一般图书的出版社是不变的,这个程序的运行没有问题,假如我们就是一个作家,有一天我们想换一个出版社出版图书,假如我们有1000本图书,如果我们要修改上面这个程序的打印信息的话,那我们就需要将对象实力化时的出版社都修改成新的出版社,这样后天的维护太麻烦了
所以我们可以将上面的出版社定义成static 让其被所有的对象共享
修改后的代码
//定义一个描述图书的类
class Book{
private String title;//标题
private String author;//作者
private double price;//价格
static String pub="沐言友拓出版社";//出版社
public Book(String title,String author,double price){
this.title=title;
this.author=author;
this.price=price;
}
//得到图书的信息
public String getInfo(){
return"出版社:"+this.pub+"图书标题:"+this.title+"作者:"+this.author+"价格"+this.price;
}
}
public class BookTest{
public static void main(String[]args){
Book book1=new Book("java重入门到项目实战","李兴华",99.2);
Book book2=new Book("spring开发实战","李兴华",98.3);
Book.pub="人民出版社";
System.out.println(book1.getInfo());
System.out.println(book2.getInfo());
}
}
输出结果

可以看出仅仅修改了一次出版社就被全部修改了
对此时的对象进行内存分析

可以发现此时的pab被所有对象共享,只有一个对象修改该属性,其他对象的该属性也将被修改
static 的应用之记录实例化了多少个对象
//用static变量来记录多少个对象被实例化
public class Static2{
private static int cnt=0;
private String name;
private int age;
public Static2(String name,int age){
this.name=name;
this.age=age;
cnt++;
System.out.println("已经实例化了"+cnt+"个对象");
}
public static void main(String[]args){
Static2 vr1=new Static2("刘涛",34);
Static2 vr2=new Static2("张三",23);
Static2 vr3=new Static2 ("小刘",35);
}
}

static 和访问权限public private的差异
可能有人认为用static 修饰之后可以扩大访问权限,其实这是一个误区

static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
静态方法的应用

//定义一个图书类实现记录图书的总是并实现自动编名
class Book{
private long number;//图书编号 该处务必用long 和数据库的设计有关
private double price ;//图书价格
private String title;//图书标题
private static long count=0;//记录图书的数量同时用于自动编号
public Book(){};
//构造方法并实现图书数量记录和自动编号
public Book(double price,String title){
count++;
this.number=count;
this.price=price;
this.title=title;
}
public double getPrice(){
return this.price;
}
public String getTitle(){
return this.title;
}
public static long getCount(){
return Book.count;
}
public void setPrice(double price){
this.price=price;
}
public void setTitle(String title){
this.title=title;
}
//获取图书信息
public String getInfo(){
return "图书标题:"+this.title+" 图书价格:"+this.price+" 图书编号:"+this.number;
}
//记录图书数量
//该方法和对象无关
public static void getSum(){
System.out.println( "当前图书总数:"+Book.count);
}
}
public class Demo{
public static void main(String[]args){
Book.getSum();
System.out.println("-----------------------------------");
Book book1=new Book(98.3,"java编程思想");
Book.getSum();
System.out.println( book1.getInfo());
System.out.println("--------------------------------");
Book book2=new Book(23.4,"java核心技术");
Book.getSum();
System.out.println( book2.getInfo());
System.out.println("----------------------------------------");
Book book3=new Book(34.3,"effectivejava");
Book.getSum();
System.out.println( book3.getInfo());
}
}

static方法不受对象的约束,可以直接调用
static代码块
static代码块会在类的加载时被执行一遍(仅仅会被执行一遍),在类中可以有多个静态代码块,执行时将会按照顺序执行,可以用此功能
来优化程序的性能
例子参考<<参考一>>



在类中定义的static块其实是优先于main方法执行的,这与主方法程序执行的开始有点不符,
不允许静态块定义在main方法中
参考:
https://www.cnblogs.com/dolphin0520/p/3799052.html
https://blog.51cto.com/lavasoft/18771
《java实战开发经典》
总结:
只有某些方法不需要受到类中实例化对象的 才会考虑用static方法,大多数情况下类中普通方法和普通变量才时主流
static 关键字分析的更多相关文章
- Java基础(二)-static关键字分析
static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改 ...
- Java Static关键字详解
提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...
- [java基础]java中static关键字
1.static概念 static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序 ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- C/C++中static关键字详解
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- 面向对象编程(七)——Static关键字
Static变量
- C/C++中static关键字详解-zz
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- [java学习笔记]java语言核心----面向对象之static关键字
static关键字用处 用于修饰成员变量和成员函数 被修饰后的成员具有以下特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意 静态方法只能访问静态成员:非静态方 ...
- (转)C/C++中static关键字
下面的转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束 ...
随机推荐
- Vmware 虚拟机连接外网和设置固定IP
NAT 模式(地址转换模式) 在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,虚拟机借助NAT功能,通过宿主机器所在的网络来 ...
- @babel/runtime 和 @babel/plugin-transform-runtime 两个的作用是什么
Babel 最基础的功能就是将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 最基础的依赖包也就是 ...
- Spring(二)-生命周期 + 自动装配(xml) +自动装配(注解)
1.生命周期 **Spring容器的 bean **的生命周期: 1.1 默认生命周期 1.1.1 生命周期 调用构造方法,创建实例对象: set方法,给实例对象赋值: init 初始化方法 初始化对 ...
- HMS Core基于地理位置请求广告,流量变现快人一步
对于想买车的用户来说,如果走在路上刷社交软件时突然在App里收到一条广告:"前方500米商圈里的某品牌汽车正在做优惠,力度大福利多."不管买不买,八成都会去看看,原因有三:距离近. ...
- 写给前端的 react-native 入门指南
前言 本文主要介绍 react-native(下称 RN) 的入门, 和前端的异同点 文章不涉及功能的具体实现 选择优势 我们先说说, 为什么很多人会选择使用 RN .他对应的特性和普通 Web 的区 ...
- Codeforces Round #606(B-D)
Dashboard - Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) - Codeforces ...
- django_day07
django_day07 django form组件 form组件的定义 class RegForm(forms.Form): user = forms.CharField(label='用户名') ...
- 虚拟机里做LUN映射(RHEL系统和centos系统皆可)(Linux版)
紧接着Windows的LUN映射之后 参考 (https://www.cnblogs.com/zhengyan6/p/16121268.html) 先删除部分配置(没有做之前的LUN映射则不用) 进网 ...
- 大家都能看得懂的源码之ahooks useInfiniteScroll
本文是深入浅出 ahooks 源码系列文章的第十七篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 简介 useInfiniteScroll 封装了常见的无限滚动逻 ...
- sys.path的使用场景
起因 在初学python时,经常遇到找不到某个路径下的文件,或者在博客中找到的代码需要暴露出环境变量(如linux中可以export PYTHONPATH="$PYTHON;/carla/b ...