当前位置: 首页 > news >正文

Java类和对象(三)

📚 目录

  • 1.static关键字
    1.1static修饰成员变量
    1.1static修饰成员方法
    1.3被static修饰的成员的访问
  • 2.代码块的分类
    2.1普通代码块
    2.2构造代码块
    2.3静态代码块



前言:接着上回我们学习的类和对象(二),今天我们继续学习有关类相关的知识。
static 关键字是 Java 中非常重要的修饰符,它能让成员变量、成员方法脱离对象而依附于类本身,实现数据共享与工具方法的封装;而不同类型的代码块则控制着类与对象初始化的时机与顺序,是理解类加载机制的关键。通过本次学习,你将能更灵活地设计类的结构,编写出更高效、更规范的 Java 代码。

1. .static关键字

被static修饰的成员变量,就已经不属于具体的对象的成员变量了。(以我们上学时候的班级来举例:每个人都不一样,但是班级里面的同学都属于同一个班级的,班级被每一个同学共有。)
而被static修饰的成员变量我们称之为:静态成员变量(与我们非静态成员变量有所不同)
被static修饰的成员变量和成员方法在进行初始化的时候也会有顺序差别。

🔙 返回目录




1. 1static修饰成员变量


首先我们创建一个Dog的类,然后让名字被static修饰。

然后我们会发现我们用this这个关键字的时候,想要输出Dog这个类的名字的时候发现根本就点不出来。

但是当我们自己手写上去的时候又发现:编译器没有报错,只有黄色的警告。
我们这么写的时候:不合理,但是合法(不建议这么写)
但是我们想要正确去访问static修饰的成员变量的时候该怎么做呢?

publicclassDog{staticStringname;publicvoidprint(){System.out.println(Dog.name);}}


我们使用类名去访问的时候编译器就会给我们弹出来name这个被static修饰的成员变量。
结论:
当我们使用类名去访问成员变量的时候编译器不会发生报错(既合法又合理)
被static修饰的成员变量,不属于某一个对象,所有对象共用一个成员变量。
被static修饰的成员变量存储的地方不是我们的堆区:而是我们的方法区内。


生命周期:也就是我们定义的类的开始到类结束。

publicclassDog{//生命周期的开始staticStringname;publicvoidprint(){System.out.println(Dog.name);}}//生命周期结束
🔙 返回目录




1. 2static修饰成员方法

被static修饰的成员方法和被static修饰的成员变量相似的。
被static修饰的成员方法已经不是某个具体的对象所拥有的,而是被每个成员变量共有。

publicclassDog{publicStringname;publicvoidprint(){System.out.println(this.name);}staticvoidcall(){//被static修饰的成员方法System.out.println("正在汪汪叫");}}

当我们使用创建的对象去调用的时候:

我们发现和static修饰的成员变量一样都是写出第一个首字母却点不出来call这个方法。

我们自己强制写出被static修饰的方法名字的时候编译器不会报错(这种写法合法但是不合理,不推荐大家使用这种方法访问被static修饰的成员方法)。
正确的访问方式:

使用类名去进行访问,我们就能够点出被static修饰的成员方法。
当我们使用我们static修饰的成员方法去访问我们没有被static修饰的成员方法的时候:

publicclassDog{publicStringname;publicvoidprint(){System.out.println(this.name);}staticvoidcall(){System.out.println("正在汪汪叫");}staticvoideat(){// System.out.println(this.name+"正在吃饭...");}}


我们发现编译器给我们报错了。
那我们非静态成员方法去访问静态成员方法呢?

我们发现编译器没有发生报错。

结论:
被static修饰的成员方法是静态成员方法。
当我们使用静态成员方法去调用(访问)非静态成员方法的时候编译器会报错。(静态成员方法不能访问非静态成员变量)
非静态成员方法内部能访问(调用)静态成员变量。
被static修饰的成员变量不能通过this关键字来调用。

🔙 返回目录




1. 3被static修饰的成员的访问

总结我们static修饰的成员变量和成员方法:
访问方式:
通过类名来调用静态成员变量或者成员方法(不建议通过对象来进行调用,因为不合理)
静态成员方法不能调用非静态成员变量。
而非静态的成员方法能调用静态成员变量。

调用方式的举例:

publicclassDog{staticStringname;publicvoidcall(){Systemout.println(Dog.name+"正在汪汪叫");//非静态成员方法访问静态成员方法}publicvoideat1(){System.out.println(Dog.name+"正在吃饭...");//静态成员方法访问静态成员变量。}}
🔙 返回目录




2.代码块的分类

什么是代码块?
代码块:{ }被花括号括起来的就是代码块。
主要用途:主要用来初始化我们的实例化对象。(包括被static修饰的成员变量)
分类:
普通代码块:主要定义在方法的{ }花括号内部的,当我们可以用这个代码块来初始化实例化的对象。(一般不用普通代码开来初始化实例化对象)
构造代码块:定义在类中,却不加任何修饰{ } ;有些书中又叫实例代码块。主要用来初始化实例成员变量。
静态代码块:主要形式:static{ } ;主要用途:初始化实例化成员变量。
同步代码块:我们在学习类和对象的时候暂时用不到这个代码块

🔙 返回目录




2. 1普通代码块

定义:定义在方法内部。

publicclassTest1{publicstaticvoidmain(String[]args){{inta=10;}inta=20;}}

通常我们不使用这样的写法。

🔙 返回目录




2. 2构造代码块

构造代码块也叫实例代码块。
主要用途:给我们成员变量进行初始化。

例如;

publicclassDog1{publicStringname;intage;{this.name="旺财";this.age=2;}}

我们在上一节的时候知道:我们在没有写不带参数的构造方法的时候编译器会默认给我们生成一个我们看不见的构造方法。
那我们的构造方法和这个普通代码块谁先调用?或者我们在写普通代码块初始化的时候不带参数的构造方法会不会被调用?

publicclassDog1{publicStringname;intage;{name="旺财";age=2;}publicDog1(){this.age=3;this.name="小黑";System.out.println("构造方法被调用...");}}
publicclassDog1{publicStringname;intage;publicDog1(){this.age=3;this.name="小黑";System.out.println("构造方法被调用...");}{this.name="旺财";this.age=2;}}


我们知道:实例代码块先被执行,后执行构造代码块。

publicclassDog1{publicStringname="旺财";intage=2;publicDog1(){this.age=3;this.name="小黑";System.out.println("构造方法被调用...");}}

和就地初始化相比:构造方法后调用。

publicclassDog1{publicStringname="小黑";intage=3;{this.name="旺财";this.age=2;}}

publicclassDog1{{this.name="旺财";this.age=2;}publicStringname="小黑";intage=3;}


和就地初始化相比:谁先写谁先被执行。

执行顺序:就地初始化=构造代码块>不带参数的构造方法

🔙 返回目录




2. 3静态代码块

静态代码块:被static修饰的{ }
主要用途:初始化静态成员变量。

静态代码块会被执行几次?

publicclassDog1{privateStringname;privateintage;{System.out.println("实例代码块被执行");}static{System.out.println("静态代码块被执行");}}
publicclassTest1{publicstaticvoidmain(String[]args){Dog1dog1=newDog1();System.out.println("=====");Dog1dog2=newDog1();}}


我们发现:静态代码块只被执行了一次。

他们的执行顺序比较:

publicclassDog1{privateStringname;privateintage;{System.out.println("实例代码块被执行");}static{System.out.println("静态代码块被执行");}}

我们发现静态代码块先被执行。
总结:
不管我们生成多少个对象:静态代码块只会被执行一次。
静态成员变量是类的属性是在JVM加载类的时候开辟并初始化的。
编译器会按照先后顺序执行各个代码块。静态>实例>构造
注意:
实例代码块只有在创建对象时才会执行。

🔙 返回目录




http://www.jsqmd.com/news/511260/

相关文章:

  • 深度剖析 Java 类初始化机制:从<clinit>()/<init>() 字节码到静态内部类懒加载实战
  • 毕设程序java苏州旅游指南网站 基于Java的姑苏城文旅信息服务平台 SpringBoot框架下的苏州文旅导览系统
  • 吉林开顶集装箱厂价格多少,正斌集装箱费用分析 - mypinpai
  • 回归分析WebApp实验室:数据驱动的可视化建模与智能分析
  • Qwen3-32B-Chat镜像免配置优势:省去CUDA/PyTorch/transformers手动安装环节
  • 毕设程序java学生心理健康教育系统 基于SpringBoot的大学生心理成长辅导服务平台 高校学生心理素养培育与咨询管理系统
  • Stable-Diffusion-v1-5-Archive 浏览器端集成:使用JavaScript实现实时风格迁移演示
  • SenseVoice-small效果验证:法庭庭审录音法律术语高精度识别案例
  • 超酷DIY壁障自平衡小车,一文全解析
  • 网络安全考量:保护cv_unet_image-colorization API接口免受攻击
  • Qwen-Image镜像完整指南:涵盖启动、测试、调试、扩展的全生命周期管理
  • LumiPixel实战:用AI生成惊艳像素人像,效果实测分享
  • Kettle9.4(Pentaho Data Integration)调度PostgreSQL18存储过程或函数,在传入指定日期时优先指定日期,未传入指定日期默认T-1昨天
  • PHP 8 新特性、Laravel/Hyperf 源码理解、MySQL 索引优化、Redis 场景应用的庖丁解牛
  • 【限时解密】Dify 0.12+版本Multi-Agent热协同协议:支持200+并发Agent动态协商,延迟<87ms——附性能调优checklist》
  • Vue—条件渲染与循环渲染
  • 代码随想录一刷记录Day1—— leetcode704. 二分查找 leetcode27. 移除元素 leetcode977.有序数组的平方
  • EasyCVR视频届的万能接口
  • Fun-ASR-MLT-Nano实战:搭建支持31种语言的语音识别服务
  • java微信小程序的外卖点餐点单系统 商家协同过滤
  • VOOHU 沃虎电子 SFP28 高速连接器 WHSFP32221F013 集成导光柱与散热孔 满足25G数据中心高密度应用
  • 提升自控力差孩子的学习生活:有效的学习障碍帮助与冲动控制训练方法
  • 2026年3月,评测精选皮带导轨厂家,导轨品牌分析深度剖析助力明智之选 - 品牌推荐师
  • 嵌入式C代码安全防线如何崩塌?静态分析7大盲区正在 silently 毁掉你的量产固件
  • 网络安全之linux2
  • LightOnOCR-2-1B多语种OCR落地:国际NGO多语言援助文件OCR+机器翻译流水线
  • 互联网是从0到1,AI是1到无穷大
  • Python基础学习(3)——容器数据类型
  • MGeo门址模型部署教程:阿里云ACK集群中MGeo服务CI/CD自动化发布流程
  • 长沙有没有能解决频繁染发问题且提供贴心售后的男士补发实体店 - myqiye