微网站开发提供的服务器深圳市企业网站seo点击软件

张小明 2026/1/9 11:30:55
微网站开发提供的服务器,深圳市企业网站seo点击软件,免费网站软件下载大全动漫,做门户网站的市场价格static关键字static关键字是什么static修饰变量static修饰方法static 修饰代码块类的加载顺序static关键字是什么 static 是 Java 中的修饰符#xff0c;用于表示某个成员#xff08;变量、方法、代码块、内部类#xff09;属于类本身#xff0c;而不是属于类的某个特定实…static关键字static关键字是什么static修饰变量static修饰方法static 修饰代码块类的加载顺序static关键字是什么static 是 Java 中的修饰符用于表示某个成员变量、方法、代码块、内部类属于类本身而不是属于类的某个特定实例。举例这里 run() 方法带 static 关键字而 eat() 方法不带 static 关键字在 main() 方法中直接调用 eat() 方法时会产生报错关键点是类和对象的区别。被 static 修饰的成员run()方法属于类本身在 JVM 加载类的字节码类加载阶段时完成初始化存储在方法区整个程序运行期间仅存在一份不依赖任何对象实例未被 static 修饰的成员eat()方法属于对象实例仅当通过 new Test() 创建对象后才会随对象在堆内存中初始化每个对象拥有该方法的独立调用入口。先创建 Test 类的对象实例通过实例调用非静态方法实例引用调用实例方法静态成员与非静态成员的差异生命周期差异静态成员在 JVM 加载类的字节码至内存时类加载阶段完成初始化存储于方法区整个程序运行期间仅初始化一次其生命周期与类的生命周期完全绑定非静态成员仅在通过 new 关键字创建类的对象实例时才初始化存储于堆内存中每个对象实例都会拥有独立的非静态成员副本其生命周期与对象实例的生命周期绑定。访问方式规则静态成员可直接通过「类名.成员名」访问无需创建类的对象实例非静态成员仅能通过类的对象实例「对象名.成员名」访问非静态成员的存在依赖具体的对象实例。static修饰变量被 static 修饰的变量称为类变量归属类本身而非类的具体对象实例由该类所有实例化的对象共享同一份内存副本任意一个对象修改该值所有对象访问到的都会是修改后的值。静态变量在 JVM 加载类时类加载阶段完成初始化存储于方法区整个程序运行期间仅初始化一次生命周期与类的生命周期绑定可通过「类名.变量名」直接访问。举例publicclassPerson{privateintage;privateStringname;staticStringfrom;publicPerson(intage,Stringname){this.ageage;this.namename;}OverridepublicStringtoString(){returnPerson [ageage namename,fromfrom];}publicstaticvoidmain(String[]args){Personperson1newPerson(20,张三);Personperson2newPerson(21,李四);Person.from中国;System.out.println(person1.toString());System.out.println(person2.toString());}}输出内存图结合内存图对该代码进行详解main() 函数入栈创建数据结构为 Person 的 person1 和 person2 对象在堆中开辟内存空间该内存空间中有 name、age、from 三块区域当使用 new 关键字创建对象时构造方法会被自动调用构造函数的作用是在创建对象的时候给对象赋值此时两个对象的 name 和 age 均被赋值。而 form 是 static 修饰的 String 类型的数据String 是被 final 修饰过的数据类型所以 form 存储的数据属于静态常量from 的值存储在方法区的静态常量池里给 from 赋值为中国假设该静态常量池的地址是0x1那么 person1 和 person2 对象的 from 区域存储的就是 from 的地址 0x1。总结person1 和 person2 的 name 和 age 属性的值都在堆内存当中进行存储且是该对象私有的但是 from 属性值是存储在方法区的静态常量池当中的是属于公共的。static修饰方法被 static 关键字修饰的方法被规范称为静态方法Static Method也常称作类方法Class Method其核心本质是归属类的全局范畴而非类实例化后的具体对象实例是类的固有行为不依赖任何对象的状态属性。静态方法执行时无 this 引用this 指向当前对象实例的引用参数而静态方法归属类本身执行时不绑定任何对象实例因此不存在 this 引用也无法使用 this 关键字同理指向父类实例上下文的 super 关键字也无法在静态方法中使用。成员访问的规则静态方法无法直接访问类的非静态成员非静态成员的生命周期依赖对象实例而静态方法在 JVM 类加载阶段即完成初始化此时可能尚无任何对象实例被创建但可通过「创建对象实例 实例.非静态成员」的方式间接访问非静态成员静态方法可直接访问类的静态成员静态属性、静态方法二者同属类级别加载时机与生命周期一致非静态方法可自由调用静态方法静态方法归属类无需依赖实例即可访问也可直接访问所有非静态成员内存与生命周期特征静态方法在 JVM 类加载的初始化阶段完成解析与初始化其字节码指令存储于方法区整个 JVM 进程运行期间类的静态方法的生命周期与类的生命周期完全绑定而非静态方法虽也存储于方法区但执行时需绑定堆内存中的具体对象实例静态方法的继承与重写特性被static修饰的静态方法可被子类继承子类无需额外实现即可通过「子类名.静态方法」或「父类名.静态方法」直接调用父类的静态方法本质是子类共享了父类类级别的方法资源。但静态方法无法被真正重写Override重写依赖运行时多态由对象的运行期类型决定方法执行逻辑而静态方法的调用由编译期声明的类名决定子类若定义与父类同名同参数的静态方法仅为隐藏父类方法子类方法覆盖父类方法的访问入口而非重写。调用时仅取决于引用变量的声明类型而非对象的实际类型无多态特性。不加 static 关键字的用法加 static 关键字的用法Animal() 和 main() 在不同类里在 main() 中调用 eat() 方法使用的是 Animal.eat();若 Animal() 和 main() 在同一个类里在 main() 中调用 eat() 方法可以直接使用 eat(); 如图这是 Java 提供的简化写法在当前类的作用域内调用本类的静态方法时允许省略类名编译器会自动补全而调用其他类的静态方法时必须显式指定类名避免歧义。static 修饰代码块被 static 关键字修饰的代码块称为静态代码块Static Block也叫静态初始化块是 Java 中专门用于初始化类级静态成员静态变量、静态资源的特殊代码结构其核心设计目的是为静态成员提供复杂的初始化逻辑。publicclassPerson{static{System.out.println(你好);}publicstaticvoidmain(String[]args){System.out.println(hello world);}static{System.out.println(hello ~);}}输出结果从结果中我么能够看到静态代码块仅在类加载的初始化阶段执行一次同一类中多个静态代码块按代码声明的从上到下顺序执行先执行父类的静态代码块再执行子类的静态代码块最后再执行实例相关代码实例代码块、构造方法。那么我们看看几个案例来分析一下类的加载顺序我们来看如下代码publicclassTestextendsBase{static{System.out.println(test static);}publicTest(){System.out.println(test constructor);}publicstaticvoidmain(String[]args){newTest();}}classBase{static{System.out.println(base static);}publicBase(){System.out.println(base constructor);}}这是代码的输出结果我们来看当前这个创建流程是什么在执行开始先要寻找到 main 方法因为 main 方法是程序的入口但是在执行main方法之前必须先加载 Test 类而在加载 Test 类的时候发现 Test 类继承自 Base 类因此会转去先加载 Base 类在加载 Base 类的时候发现有 static 块便执行了 static 块。在 Base 类加载完成之后便继续加载 Test 类然后发现 Test 类中也有 static 块便执行 static 块。在加载完所需的类之后便开始执行 main 方法。在main方法中执行 new Test() 的时候会先调用父类的构造器然后再调用自身的构造器。因此便出现了上面的输出结果。简单来说先创建父类的 static 代码块输出 “base static” 再创建子类的 static 代码块输出 “test static”这个过程属于扫描过程。然后 main 方法入栈之后 new test() 创建当前子类对象但创建子类对象的是先创建父类对象所以在这个地方先表达的是这个 base 功能函数输出 base constructor然后回过头来再创建输出 “test constructor”。我们再来看这个代码publicclassDemo{publicDemo(Stringnum){System.out.println(num);}static{System.out.println(111);}publicstaticDemodemonewDemo();static{System.out.println(222);}}classDemoTest{publicstaticvoidmain(String[]args){DemodemonewDemo(---);}}这是输出结果在Java中类的加载是按需进行的当JVM启动时并不会一次性加载所有的类而是在程序运行过程中当需要用到某个类的时候才会加载它。程序的完整执行顺序如下JVM 启动首先加载并初始化 DemoTest 类它是包含 main 方法的程序入口类由于 DemoTest 类种无其他静态变量 / 静态代码块直接执行 main 方法。main 方法中执行 new Demo(“—”) 语句JVM 检测到 Demo 类尚未完成初始化暂停 main 方法的执行进入Demo 类的初始化阶段。Demo 类的初始化阶段按代码书写顺序执行所有静态初始化操作静态代码块和静态变量显式赋值属于同一优先级的静态初始化语句无先后优先级仅按顺序执行第一步执行第一个静态代码块控制台输出 111第二步执行静态变量demo的显式赋值语句public static Demo demo new Demo()执行 new Demo(“”) 触发 Demo 类的实例化流程调用 Demo 的构造函数 Demo(String num)传入参数“控制台输出实例创建完成将该实例赋值给静态变量demo第三步执行第二个静态代码块控制台输出 222此时 Demo 类的静态初始化全部完成JVM 回到 main 方法继续执行暂停的 new Demo(”—“) 语句触发 Demo 类的实例化流程调用构造函数 Demo(String num)传入参数”—控制台输出---程序执行结束。类的加载顺序类初始化阶段仅执行一次① 父类静态变量显式赋值 → ② 父类静态代码块按声明顺序→ ③ 子类静态变量显式赋值 → ④ 子类静态代码块按声明顺序对象实例化阶段每次new子类都执行⑤ 父类实例变量显式赋值 → ⑥ 父类实例代码块按声明顺序→ ⑦ 父类构造方法→ ⑧ 子类实例变量显式赋值 → ⑨ 子类实例代码块按声明顺序→ ⑩ 子类构造方法// 父类classParent{// 父类静态变量1staticintparentStaticVarprintNum(1.父类静态变量显式赋值);// 父类静态代码块1static{printNum(2.父类静态代码块1);}// 父类静态代码块2static{printNum(3.父类静态代码块2);}// 父类实例变量1intparentInstanceVarprintNum(5.父类实例变量显式赋值);// 父类实例代码块{printNum(6.父类实例代码块);}// 父类构造方法publicParent(){printNum(7.父类构造方法);}// 辅助打印方法静态publicstaticintprintNum(Stringmsg){System.out.println(msg);return0;// 仅为赋值用无实际意义}}// 子类classChildextendsParent{// 子类静态变量1staticintchildStaticVarprintNum(4.子类静态变量显式赋值);// 子类静态代码块static{printNum(4.子类静态代码块);// 注意和静态变量按声明顺序这里是第4步后}// 子类实例变量1intchildInstanceVarprintNum(8.子类实例变量显式赋值);// 子类实例代码块{printNum(9.子类实例代码块);}// 子类构造方法publicChild(){// 隐含super()会先执行父类实例初始化printNum(10.子类构造方法);}}// 测试类publicclassClassLoadOrderTest{publicstaticvoidmain(String[]args){System.out.println(第一次创建子类实例);Childc1newChild();System.out.println(\n第二次创建子类实例);Childc2newChild();}}执行结果如下阶段 1加载入口类执行 main 方法开头JVM 启动后首先加载 ClassLoadOrderTest 类包含 main 方法的入口类执行main方法第一行控制台输出第一次创建子类实例阶段 2第一次创建 Child 实例触发类初始化与实例化执行 new Child() 时JVM 发现 Child 类未初始化且 Child 继承自 Parent因此先完成父类→子类的静态初始化再执行父类→子类的实例化。静态资源是类级别的父类是子类的基础因此先初始化父类静态资源父类 Parent 的静态初始化仅执行 1 次按代码书写顺序执行父类的静态资源静态变量显式赋值 静态代码块子类 Child 的静态初始化仅执行 1 次父类静态初始化完成后按代码书写顺序执行子类的静态资源静态变量显式赋值 静态代码块父类 Parent 的实例化子类构造隐含 super ()子类静态初始化完成后开始实例化 Child 对象子类构造方法第一行隐含super()调用父类无参构造因此先执行父类的实例资源执行父类实例变量显式赋值再执行父类实例代码块子类 Child 的实例化父类实例化完成后执行子类的实例资源子类实例变量显式赋值与子类实例代码块再执行子类构造方法阶段 3第二次创建 Child 实例仅执行实例化此时 Parent 和 Child 的静态初始化已完成因此仅执行父类→子类的实例化。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站可以自己做微网站分享功能

第一章:MCP Azure 量子开发认证考点解析Azure 量子开发认证(Microsoft Certified: Azure Quantum Developer)面向掌握量子计算原理并能使用 Azure Quantum 服务构建和运行量子算法的专业开发者。该认证重点考察候选人在量子编程、量子电路设计…

张小明 2026/1/8 19:35:00 网站建设

设计师个人网站源码今天安阳最新消息

电子元件与树莓派开发入门 1. 常见电子元件介绍 二极管(Diodes) :电阻会双向阻止电流流动,而二极管是一种双端电子元件,具有单向低电阻、反向高电阻的特性。二极管大多由硅制成,发光二极管(LED)是电子电路中最常用的二极管,当在其阳极和阴极提供足够电压时会发光。…

张小明 2026/1/2 5:46:00 网站建设

手工业网站怎么做儿童网站设计模板

如何通过LobeChat提升大模型token使用效率? 在构建AI驱动的应用时,开发者常常面临一个现实困境:明明模型能力越来越强,但每次对话的成本却依然高得让人皱眉。尤其是当你的应用开始接入GPT-4、Claude或本地部署的Llama 3这类大模型…

张小明 2026/1/6 3:01:56 网站建设

天津建设网站个人宽带弄网站可以吗

毕业论文(设计)开题报告姓名学号学院专业信息管理与信息系统班级指导教师题目名称基于JAVAMySQL技术的WOR超市管理系统设计与实现选题类别□毕业论文 ☑毕业设计 □涉密论文 □其它题目类型□理论研究 ☑应用研究 □其它…

张小明 2026/1/3 11:55:16 网站建设

小程序项目描述怎么写谷歌seo怎么做的

文章详细解析了大语言模型幻觉问题的定义、成因和分类,提出了多种缓解方案。幻觉分为事实冲突、无中生有、指令误解和逻辑错误四类。解决方案包括检索增强生成(RAG)和后验幻觉检测,后者又分为白盒方案(基于模型内部状态)和黑盒方案…

张小明 2026/1/4 5:03:44 网站建设

深圳html5网站开发建站技巧

想要轻松下载B站视频进行离线观看或内容收藏?BilibiliDown作为一款跨平台GUI工具,让你告别复杂的命令行操作,实现一键式视频下载管理。无论是个人收藏还是批量处理,这款工具都能满足你的多样化需求。 【免费下载链接】BilibiliDow…

张小明 2026/1/4 0:09:41 网站建设