在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. 经典设计原则 - SOLID

    SOLID 设计原则包含以下 5 种原则: 单一职责原则(Single Responsibility Principle, SRP) 开闭原则(Open Closed Principle, OCP) ...

  2. [WPF]使用DispatcherUnhandledException捕捉未经处理的异常

    使用DispatcherUnhandledException捕捉未经处理的异常 using System.Windows; namespace Test02 { /// <summary> ...

  3. Navicat的使用与python中使用MySQL的基本方法

    Navicat的使用与python中使用MySQL的基本方法 Navicat的下载及安装 下载地址 http://www.navicat.com.cn/download/navicat-premium ...

  4. TMC2209步进驱动芯片基本配置及使用

    TMC2209是用于两相步进电机的超静音电机驱动器IC. TMC2209与许多传统驱动器以及TMC2208引脚兼容. TRINAMICs先进的StealthChop2斩波器可确保电机无噪音运行,实现最 ...

  5. Linux安装Jenkins及配置svn使用

    目录 1. 下载 2. 创建文件夹 3. 安装 4. 修改端口,不用这步 5. 安装插件提速 6. 启动 7. 页面访问 8. 新建用户 9. 安装Subversion插件 10. 安装maven插件 ...

  6. FusionCopmpute之CNA,VRM虚拟机安装

    CNA和VRM安装步骤一样,需要修改的只有IP 按步骤创建 修改自己虚拟机想要存放的位置 需要把自己网络同样配置为仅主机(提前配好) 自己也可以修改至200G 虚拟机只是用多少取多少 CNA可以设置为 ...

  7. kindeditor获取html内容之终极大法

    请允许我哔哔两句,真是难受啊,有问题去百度,结果百了一堆乱七八糟的内容,有头没尾,有尾没头的,搞得我晕头转向,现在把kindeditor获取HTML的终极打法无偿分享出来,这可是我配置查找了一下午的成 ...

  8. Rust-语句和表达式

    语句和表达式 Rust 的函数体是由一系列语句组成,最后由一个表达式来返回值,例如: fn add_with_extra(x: i32, y: i32) -> i32 { let x = x + ...

  9. Docker网络详细理解-容器网络互通

    这篇文章主要解决以下几个问题: 1.同一个网段的容器互相之间通过ip进行ping通 2.同一个网段的容器互相之间通过容器名,通过使用--link进行ping通,已放弃这种方法 3.同一个网段的容器互相 ...

  10. (三)JPA - EntityManager的使用

    (二)JPA 连接工厂.主键生成策略.DDL自动更新 建议在需要使用时,看看之前的文章,先把环境搭起来. 4.EntityManager EntityManager 是完成持久化操作的核心对象. En ...