在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()); }
}
运行结果
![](https://img2022.cnblogs.com/blog/2942946/202210/2942946-20221025225146465-227031292.png)

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

该程序来说一般图书的出版社是不变的,这个程序的运行没有问题,假如我们就是一个作家,有一天我们想换一个出版社出版图书,假如我们有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 关键字分析的更多相关文章

  1. Java基础(二)-static关键字分析

    static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改 ...

  2. Java Static关键字详解

    提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...

  3. [java基础]java中static关键字

    1.static概念 static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序 ...

  4. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

  5. C/C++中static关键字详解

    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...

  6. 面向对象编程(七)——Static关键字

    Static变量

  7. C/C++中static关键字详解-zz

    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...

  8. [java学习笔记]java语言核心----面向对象之static关键字

    static关键字用处 用于修饰成员变量和成员函数 被修饰后的成员具有以下特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意 静态方法只能访问静态成员:非静态方 ...

  9. (转)C/C++中static关键字

    下面的转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束 ...

随机推荐

  1. MySQL-配置参数时 报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu......

    报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu...... 原因: 1.第一次配置参数时,不完整,出现错误!,(报错也会产生CMak ...

  2. 常用类--String

    一.String 1.1 String是不可变对象 String的底层是一个 char类型字符数组 String类是final修饰的,不能被继承,不能改变,但引用可以重新赋值 String采用的编码方 ...

  3. jsp获取单选按钮组件的值

    jsp获取单选按钮组件的值 1.首先,写一个带有单选按钮组件的前台页 1 <%@ page language="java" contentType="text/ht ...

  4. feign远程调用出错

    如果你传递的参数,比较复杂时,默认会采用POST的请求方式. 传递单个参数时,推荐使用@PathVariable,如果传递的单个参数比较多,这里也可以采用@RequestParam,Feign接口中不 ...

  5. virtio_net设备的校验和问题

    我们来看一个virtio_net设备的校验和配置: [root@10 ~]# ethtool -K eth0 tx-checksumming on //caq:大写的K用来调整feature [roo ...

  6. 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ...

  7. 第六十二篇:Vue的双向绑定与按键修饰符

    好家伙,依旧是vue的基础 1.按键修饰符 假设我们在一个<input>框中输入了12345,我们希望按一下"Esc" 然后删除所有前面输入的内容,这时候,我们会用到按 ...

  8. js工厂模式和构造函数

    <!DOCTYPE html><html><head> <title>工厂模式和构造函数</title> <meta charset ...

  9. 第六章:Django 综合篇

    前面五章,已经将Django最主要的五大系统介绍完毕,除了这些主要章节,还有很多比较重要的内容,比如开发流程相关.安全.本地化与国际化.常见工具和一些框架核心功能.这些内容的篇幅都不大,但整合起来也是 ...

  10. Windows 下JDK绿色免安装制作教程

    java自从被oracle收购后,windows下新的版本只有安装版.没有zip免安装. windows安装版有一下坏处 会写注册表 会将java.exe,javaw.exe 等解压到C:\Windo ...