Java小白的学习之路——day11(静态)

news2024/9/21 14:33:14

 

目录

一、java的内存分析

 1.java的内存区域

二、静态static

静态属性

静态方法

类加载

什么是类加载?

什么是触发类加载?


一、java的内存分析

 1.java的内存区域

java的内存区域有五个区域

i.堆区:存放new的对象、成员遍历、常量池(存储字符串常量)

ii.栈区:存放局部遍历

iii.方法区:calss资源、static资源,它优先于对象进行加载,相同的资源只维护一份

iv.寄存器:用于存放于线程有关的资源

v.本地方法区:用于存放第三方语言的资源

通过代码实例进行分析可得,一般先将class加载到内存---方法区,实例化对象的资源到堆区,将new空间赋值给引用遍历--栈区,给成员变量赋值---堆区

class Woman{
	String name;//记住这里要有个成员属性
	public void eat() {
		System.out.println(name+"正在吃饭");
	}
}

public class Test2 {
	public static void main(String[] args) {
		Woman woman = new Woman();//1.生成test2.class和woman.class文件
		woman.name="小明";
		woman.eat();
	}
}

二、静态static

静态属性

在这里我们要先对比静态属性与成员属性的区别

存储位置:成员属性存储在堆区,静态属性存储在方法区

调用方式:成员属性是对象调属性,静态属性是类调用静态属性

加载顺序:静态属性优先于成员属性进行加载

下面的代码示例说明,当我们实例化多个对象时,每个对象都有独立的成员属性,但是共享同一份静态属性

class Boy{
	//String name;
	static String name;//静态变量与成员变量不能同时写在这,会报错
	public void wash() {
		System.out.println("男朋友"+name+"正在帮我洗衣服");
	}
}


public class Test1 {
	public static void main(String[] args) {
		Boy pyy = new Boy();//注意这里有个易错点,这里的创建空间有问题
		//pyy.name="彭于晏";
		Boy.name="彭于晏";
		Boy wyz = new Boy();
		//wyz.name="吴彦祖";//牢牢记住这里有个知识点,命名规则
		Boy.name="吴彦祖";//静态属性属于类,推荐用类名调
		//pyy.wash();
		wyz.wash();
	}
}

上面的案例说明了另一个情况,虽然静态属性可以在面向对象里面直接使用,但是它的应用场景大概有两种,一是共享资源时使用,二是作为状态值时使用

场景1:共享资源时使用

//静态属性的应用场景:共享资源时使用,统计一个类的对象被创建过多少次
class A{
	static int count=0;
	public A() {
		count++;
	}
}

public class Test2 {
	public static void main(String[] args) {
		new A();
		new A();
		new A();
		System.out.println("A类被实例化了"+A.count+"次");
	}
	
}

场景2:状态值时使用

//静态属性作为状态值使用的案例
//状态值:就是静态常量——
public class Test3 {
	static final int HTTP_OK = 200;
	static final int HTTP_ERROR = 404;
	
	public static void main(String[] args) {
		int state = getPageState();
		if(state==HTTP_OK) {
			System.out.println("返回页面成功");
		}else if(state==HTTP_ERROR){
			System.out.println("失败的页面状态");
		}
		
	}

	private static int getPageState() {
		return HTTP_OK;
	}
}

静态方法

在成员方法的前面加入static修饰变为静态方法,注意在成员方法中可以使用静态属性,在静态方法中不能使用成员属性

应用场景:一般静态方法常常用于工具类中,在工具类中的静态方法我们可以直接使用类名区调用,可以在整个项目中使用

注意事项:静态方法可以抽取到工具类中共享,静态方法中不能使用this与super,静态方法不能被重写,静态方法可以被继承但不能重写

class A{
	String name;
	static int age;
	public void test() {
		System.out.println(age);
	}
	public static void staticTest() {
		System.out.println(age);
	}
}

public class Test1 {
	public static void main(String[] args) {
		new A().test();
		A.staticTest();
	}
}

类加载

什么是类加载?

类加载是指找到class文件,可以获取到文件中的所有资源,包名、类名、属性、方法以及构造器等

什么是触发类加载?

实例化对象、实例化子类对象、静态属性以及静态方法以及使用Class.forName(全限定名)--反射

代码示例

class A{
	String name = "占山";
	{
		System.out.println(name);//这里写上面的name,因为已经赋值好了
		
	}
	public A() {//构造方法这里可以不用加{}
		System.out.println("动态构造方法");
	}
}

public class Test1 {
	public static void main(String[] args) {
		new A();
		new A();
	}
}
class A2{
	static String name="占山";
	static {
		System.out.println(name);
		System.out.println("静态代码块");
	}
}

public class Test2 {
	public static void main(String[] args) {
		new A2();
		new A2();//实例化多次对象,只触发一次
	}
}
class AA{
	String name = "成员属性";
	static String name2 = "静态属性";
	static{
		System.out.println(name2);//静态代码块
		System.out.println("静态代码块");
	}
	public AA(){
		System.out.println("动态构造方法");
	}
	{
		System.out.println(name);
	}
}

public class Test3 {
	public static void main(String[] args) {
		new AA();
		System.out.println("----");
		new AA();
	}
}
class AAA{
	String name = "父类成员属性";
	static String name2 = "父类静态属性";
	static{
		System.out.println(name2);//静态代码块
		System.out.println("父类静态代码块");
	}
	public AAA(){
		System.out.println("父类动态构造方法");
	}
	{
		System.out.println(name);
	}
}

class B extends AA{
	String name = "子类成员属性";
	static String name3 = "子类静态属性";
	{
		System.out.println(name);
		System.out.println("子类动态代码块");
	}
	static {
		System.out.println(name3);
		System.out.println("子类静态代码块");
	}
}

public class Test4 {
	public static void main(String[] args) {
		new B();
		System.out.println("----");
		new B();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Yolov5-Lite + Sort算法实现边缘目标跟踪

文章目录 前言项目结构Sort算法实现卡尔曼跟踪器工具类多目标跟踪器 整合 前言 昨天挖了个坑,那么今天的话把坑填上,只要是实现Sort算法和Yolov5-Lite的一个整合。当然先前的话,我们在Yolov3–Tiny的时候,也做了一个,…

Netty实战(一) netty入门之创建echo服务器

目录 一、理论知识1. 网络协议TCP/UDP2. netty简介3. 依赖4. netty核心类介绍 二、开发实战1. 服务端2. 客户端 demo源码参考 一、理论知识 1. 网络协议TCP/UDP TCP、UDP协议属于七层协议中传输层的协议,这两种主流协议的差异: TCP是一个面向连接的、…

ArcGIS Pro遥感影像分类:随机森林、支持向量机方法

本文介绍在ArcGIS Pro软件中,基于随机森林、支持向量机等多种算法,对遥感影像数据加以监督分类的具体方法。 在文章ArcGIS中ArcMap栅格遥感影像的监督分类(https://blog.csdn.net/zhebushibiaoshifu/article/details/126905442)中…

【已解决】Couldn‘t find a tree builder with the features you requested: lxml

这是一个常见于Python爬虫代码的报错。 报错代码: soup BeautifulSoup(r.text, xml) 报错原因: BeautifulSoup的解析方法之一,xml,需要安装好lxml库才行 解决办法: 安装 lxml 库即可。 pip install lxml 安装好…

HTML的Input(type)的属性都有哪些

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🌼欢迎小伙伴们访问到博主的文章内容&am…

笨笨的刷题日记

关注我,带你一起学习,共同成长。 LeetCode 还记得三年前找实习的时候 leetCode 还是 1000 题左右,现在都飙到 3000 题了,还有前端狗专用的 JavaScript 系列。这个世界真实太疯狂了。 leetCode 部分习题参考答案 正在更新中 标号…

C++primer(第五版)第十五章(面向对象程序设计)

15.1 OOP:概述 面向对象程序设计(object-oriented programming)的核心思想是数据抽象,继承和动态绑定(个人认为应该是多态,但是书里原话是动态绑定,因此不太确定). 一开始,C只是C加上一些面向对象特性.C最初的名称C with Classes 也反映了这个血缘关系 …

摆动排序 II · Wiggle Sort II

链接: 题解: 1.先用partition函数,求得n/2的位置的排序 2.然后选取首尾指针(奇数选择1和length-1,偶数选择为1和length-2),进行swap交换 3.每次首指针每次2,尾指针每次-2 九章算…

使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录

一、需求分析 如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号。 同端互斥登录,指的就是:像腾讯QQ一样,在同一类型设备上只允许单地点登…

Spring:Bean生命周期

Bean 生命周期 生命周期 Bean 生命周期是 bean 对象从创建到销毁的整个过程。 简单的 Bean 生命周期的过程: 1.实例化(调用构造方法对 bean 进行实例化) 2.依赖注入(调用 set 方法对 bean 进行赋值) 3.初始化&#x…

IDEA使用教程 安装教程

16. Codota 插件 Codota 插件可以根据使用频率优先显示较常用的类和方法。然而,是否使用该插件取决于个人的偏好。有时工具只能作为参考,仍然需要依靠个人记忆来确保准确性。 17. 快速查看类和字段的注释 按下 F2 键可以快速查看某个类或字段的文档注…

编译运行Secure Value Recovery Service v2

下载项目 git clone https://github.com/signalapp/SecureValueRecovery2.git编译 make dockersh报错 修改Dockerfile ARG PROTOC_GEN_GO_GITREV6875c3d7242d1a3db910ce8a504f124cb840c23a RUN go env -w GOPROXYhttps://goproxy.cn,direct RUN go install google.golang.org/p…

阿里云轻量应用服务器和云服务器的区别

阿里云服务器ECS和轻量应用服务器有什么区别?云服务器ECS是明星级云服务器,轻量应用服务器可以理解为简化版的云服务器ECS,轻量适用于单机应用,云服务器ECS适用于集群类高可用高容灾应用,阿里云百科来详细说下阿里云轻…

MachineLearningWu_10_NeuralNetwork

x.1 课程目录 为了开始我们的学习,我们会先列出我们的课程目录,诸如以下, x.2 NN的发展 NN一开始是为了模仿人类大脑,但随着时间的演进,逐渐被使用在各种应用之中, 深度学习DL为何最近几年突飞猛进呢&…

IDEA使用插件绘制UML类图+PlantUML语法讲解

安装 IDEA安装插件 安装完插件记得重启一下IDEA 安装Graphviz(亲测win11可以使用) 安装完插件之后,还需要安装Graphviz才可以渲染图形。 Graphviz安装包下载地址 安装过程很简单,直接双击或者管理员身份运行即可,注…

高性能内存对象缓存 Memcached

高性能内存对象缓存 Memcached Memcached 概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网站的访问速度 Memcached 是典型的 C/S 架构,因此需要安装 Memcached 服务端与 Memcached API 客户端。 数据存…

实验三(OSPF)7 8

解题思路: 先配置好路由的环回及规划好IP地址,确保正确; (由于r8模拟为运营商,因此r1,r2,r3各写一条缺省指向r8 并测试) hub-spoke网络结构,需要在r1-r2-r3建立隧道0配置MGRE-多点通用路由协…

FreeRTOS ~(七)互斥量 ~ (3/3)互斥量的缺陷和递归锁

前情提要 FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷 FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷 FreeRTOS ~(六)信号量 ~ (2/…

超详细 | 遗传-粒子群自适应优化算法及其实现(Matlab)

作者在前面的文章中介绍了两种经典的优化算法——遗传算法(GA)和粒子群算法(PSO),这些智能优化算法解决问题的方式和角度各不相同,都有各自的适用域和局限性,对智能优化算法自身做的改进在算法性能方面得到了一定程度的提升,但算法…

前端如何实现面向对象

交流所记: 面向对象的三要素: 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的类或者对象隐藏信息继承:它可以使用现有类的所有功能,并在无…