Java中的static

目录

static修饰成员变量

静态成员变量特征

 static修饰成员方法

【静态方法特性】

static成员变量初始化

就地初始化

静态代码块初始化

注意事项


static修饰成员变量

静态成员变量特征

static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的,他有以下特征
  • 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  • 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  • 类变量存储在方法区当中
  • 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

而static的这个特性,可以帮我们进行很多高效的编程,我们拿学生类进行举例

class Student {public String name;public String gender;public int age;  public double score;public Student(String name, int age) {this.name = name;this.age = age;}
}
    public static void main(String[] args) {Student s1 = new Student("Li leilei", "男", 18, 3.8);Student s2 = new Student("Han MeiMei", "女", 19, 4.0);Student s3 = new Student("Jim", "男", 18, 2.6);}

我们声明3个对象,分别是3个学生,假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?答案是不行的,之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的

public class Student {public String name;public String gender;public int age;public double score;public static String classRoom = "A306";public static void main(String[] args) {// 静态成员变量可以直接通过类名访问System.out.println(Student.classRoom);Student s1 = new Student("Li leilei", "男", 18, 3.8);Student s2 = new Student("Han MeiMei", "女", 19, 4.0);Student s3 = new Student("Jim", "男", 18, 2.6);// 也可以通过对象访问:但是classRoom是三个对象共享的System.out.println(s1.classRoom);System.out.println(s2.classRoom);System.out.println(s3.classRoom);}
}

static修饰成员方法

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
public class Student {// ...private static String classRoom = "A306";// ...public static String getClassRoom() {return classRoom;}
}public class TestStudent {public static void main(String[] args) {System.out.println(Student.getClassRoom());}
}

静态方法特性

  • 不属于某个具体的对象,是类方法
  • 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
  • 不能在静态方法中访问任何非静态成员变量
  • 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
  • 静态方法无法重写,不能用来实现多态
public static String getClassRoom(){System.out.println(this);return classRoom;}// 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 thispublic static String getClassRoom(){age+=1;return classRoom;}// 编译失败:Error:(35, 9) java: 无法从静态上下文中引用非静态 变量 age
public static String getClassRoom(){doClass();return classRoom;}
// 编译报错:Error:(35, 9) java: 无法从静态上下文中引用非静态 方法 doClass()

static成员变量初始化

静态成员变量的初始化分为两种:就地初始化和静态代码块初始化

就地初始化

就地初始化指的是:在定义时直接给出初始值
public class Student{private String name;private String gender;private int age;private double score;private static String classRoom = "A306";
// ...
}

静态代码块初始化

使用 static定义的代码块称为静态代码块,一般用于初始化静态成员变量

public class Student{private String name;private String gender;private int age;private double score;private static String classRoom;//实例代码块{this.name = "mike";this.age = 12;this.gender = "man";System.out.println("I am instance init()!");}// 静态代码块static {classRoom = "A306";System.out.println("I am static init()!");}public Student(){System.out.println("I am Student init()!");}public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();}
}

注意事项

  • 静态代码块不管生成多少个对象,其只会执行一次
  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
  • 实例代码块只有在创建对象时才会执行



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/161461.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java VMTranslator Part II

用Java写一个翻译器,将Java的字节码翻译成汇编语言 目录 程序控制流开发 基本思路 核心代码 实验结果,使用例子进行验证 函数调用 基本思路 核心代码 实验结果,使用例子进行验证 Parser CodeWriter Main 程序控制流开发 基本思路…

深度学习服务器(Linux)开发环境搭建教程

当你拿到一台服务器的使用权时,最头疼的莫过于登陆服务区并配置开发环境。本文将从0开始,讲述一台刚申请的服务器远程登陆并配置开发环境的全过程。希望对你有所帮助 1.登陆服务器 打开MobaXterm软件,创建一个新的Session,选择S…

Web - Servlet详解

目录 前言 一 . Servlet简介 1.1 动态资源和静态资源 1.2 Servlet简介 二 . Servlet开发流程 2.1 目标 2.2 开发过程 三 . Servlet注解方式配置 ​编辑 四 . servlet生命周期 4.1 生命周期简介 4.2 生命周期测试 4.3 生命周期总结 五 . servlet继承结构 5.1 ser…

SpringBoot-WebSocket浏览器-服务器双向通信

文章目录 WebSocket 介绍入门案例 WebSocket 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 应用场景: 视…

关系型数据库 期末复习(未完

关系型数据库 绪论概念间的关系数据库的历史信息和数据数据模型 关系模型数据结构关系完整性关系操作语言 关系代数语言 绪论 概念间的关系 数据->数据库->数据库管理系统->数据库系统 数据库的历史 人工管理阶段 -> 文件系统阶段 -> 数据库系统阶段 数据库…

逆向学习记录(1)windows系统基本配置

我的环境:win10系统64位。 可以在虚拟机上操作。改天记录一下如何安装虚拟机及里面的系统。 1、查看windows版本情况 按下winr,输入winver,即可。 2、新装的windows系统,桌面上没有我的电脑图标? 在桌面上右键&…

D-Link账号密码泄露

构造payload: /getcfg.php SERVICESDEVICE.ACCOUNT&attackture%0D%0AAUTHORIZED_GROUP%3D1漏洞证明: 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技…

shell script函数function篇

function fname(){ 程序段 } #这个比较熟悉了,和其他计算机语言定义函数的格式都是相同的,上案例,自定义printf函数 总结:函数定义的格式,和其他语言大同小异,不同的是在函数调用方面,c和java…

社区牛奶智能售货机为你带来便利与实惠

社区牛奶智能售货机为你带来便利与实惠 低成本:社区牛奶智能货机的最大优势在于成本低廉,租金和人工开支都很少。大部分时间,货柜都是由无人操作来完成销售任务。 购买便利:社区居民只需通过手机扫码支付,支付后即可自…

ICCV2023 Tracking paper汇总(一)(多目标跟随、单目标跟随等)

一、PVT: A Simple End-to-End Latency-Aware Visual Tracking Framework paper: https://openaccess.thecvf.com/content/ICCV2023/papers/Li_PVT_A_Simple_End-to-End_Latency-Aware_Visual_Tracking_Framework_ICCV_2023_paper.pdf github: https://…

阿里云多款ECS产品全面升级 性能最多提升40%

“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新,为客户创造业务价值。”10月31日,杭州云栖大会上,阿里云弹性计算计算产品线负责人张献涛表示,通过持续的产品和技术创新,阿里云发布了HPC优化实例等多…

一个使用uniapp+vue3+ts+pinia+uview-plus开发小程序的基础模板

uniappuviewPlusvue3tspiniavite 开发基础模板 使用 uniapp vue3 ts pinia vite 开发基础模板,拿来即可使用,不要删除 yarn.lock 文件,否则会启动报错,这个可能和 pinia 的版本有关,所以不要随意修改。 拉取代码…