大家好,又见面了,我是你们的朋友全栈君。 变量名首写字母使用小写,如果由多个单词组成,从第2个单词开始的其他单词的首写字母使用大写。
学习的过程就是填坑的过程,可不要偷懒想着跳过去,你现在跳过去,就相当于给自己挖了一个坑,你迟早会掉进去的,为了避免不掉坑,所以,努力填坑吧!
静态成员归属 : 静态成员变量 是特殊的成员变量 , 是 类所有的 成员 , 而不是对象所有的成员 ;
本文将一点一滴的累计记录Java中的一些细节知识。不只是加以说明,而是所有的细节都找到来源,以官方文档、知名社区的介绍为主。
成员变量和局部变量都是 Java 中常用的变量类型。成员变量存储在堆内存中,具有较长的生命周期和共享性;而局部变量存储在栈内存中,生命周期短暂且仅限于所属的方法、构造函数或代码块。通过合理使用这两种变量,我们可以更好地管理数据和控制程序流程。
作者:Winston 链接:https://www.zhihu.com/question/294221894/answer/493705474 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
之前在刚开始学习Java的时候,就谈了谈Java基础中的变量,虽然知道这货以后会经常用到,但没想到了基本语法这里,竟然有冒出来了成员变量、局部变量和静态变量。变来变去太容易让人搞晕了,挑拣出来梳理一下喽!
②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
静态成员是指成员变量和成员函数前加上关键字static。 静态成员分为:静态成员变量、静态成员函数; 静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 静态成员函数: 所有对象共享同一个函数 静态成员函数只能访问静态成员变量 #include<iostream> using namespace std; class Person{ public: //类内声明,静态成员变量也是有访问权限的 static int m_a; static void fun
04.Java对象和类 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念。 对象:对象是类的一个
假设现在有5名同学,他们的性别、年龄可能各不一样,但是上课的教室一样的,你会怎么去定义这个类呢?这里面有一个共同点,教室是一样的,你如果把教室设置成对象的成员变量,那么每new一个对象,都会包含这个成员变量,造成空间上的浪费和不必要的麻烦。我们的本意是想要共享,而不是每个对象都存一份。
1. 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在;
在Java编程中,变量是存储数据的基本单元。根据变量的定义位置和作用范围,Java中的变量可以分为静态成员变量和实例成员变量。理解这两种变量的区别和使用场景,是掌握Java编程的重要一步。本篇文章将详细介绍静态成员变量和实例成员变量的定义、用法及其区别,帮助你全面理解这些重要概念。
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。
在JDK的Java类源码里面,很多工具包的代码都有在使用某个成员变量之前,先拷贝该变量的对象引用到方法的局部变量之中,如下:
Java中关键字有54个之多。常用的那些字不必说,有几个关键字并不常见,但是面试中可能成为面试官挖的一个坑,深坑。
静态成员变量(被static修饰,属于类、加载一次、内存中只有一份)。直接用 类名 访问即可,因为类只有一个,所以静态成员变量在内存区域中也只有一份,所有的对象都可以共享该变量。
使用new创建堆区数据,需要人为释放,new出来的东西是等到整个进程结束了才会自动释放。如果这个对象已经销毁,而这个类里没有析构函数却恰恰有个指针,自动释放的是栈区的变量,而不是堆区的,那么这个地址就没有指针指向它,就造成了内存泄漏。
在C++编程中,静态成员与静态函数是类设计中的重要概念,它们打破了常规成员的“每个对象一份”的规则,为类的所有实例共享同一份数据或行为提供了途径。本文将简明扼要地介绍静态成员与静态函数的基本概念、常见问题、易错点以及如何避免这些问题,并通过实例代码加深理解。
当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的方法直接用类名调用就行!
this指针 this指针指向被调用的成员函数所属的对象 this指针是隐含每一个非静态成员函数类的指针 this指针无需定义可直接使用 用途: 1.当形参和成员变量相同时,可用this进行区分 2.在类的非静态成员中返回对象本身,可用return this
原文地址:https://www.jb51.net/article/125298.htm
平时我们在写类的时候,类中的成员变量,我们一般是通过对象名来访问public成员变量的,一般private(私有)的成员变量,对象是不能直接访问的;同时我们要明白每个对象的成员变量都是专属的,而且成员变量是不能在对象之间共享的,这就是专属性。下面我们来做一个小的程序需求来慢慢引出静态成员变量:
但spring中的单例也不影响应用并发访问。大多数时候客户端都在访问我们应用中的业务对象,为减少并发控制,不应该在业务对象中设置那些容易造成出错的成员变量。
volatile和Synchronized区别 volatile Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量 的原始值对比。这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而volatile关键字就是提示JVM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。 使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchron
Java内存模型深度解读 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。 如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。 原始的Java内存模型存在一些不足,因此Java内存模型在Java1.5时被重新修订。这个版本的Java内存模型在Java8中人在使用
面向对象思想:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象;
在Java中,被static修饰的成员变量,称为类成员。其不属于某个具体的对象,类成员只有一份且是共享的在方法区中。
Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。
在平时开发当中,我们经常会遇见static关键字。这篇文章就把java中static关键字的使用方法的原理进行一个深入的分析。先给出这篇文章的大致脉络:
static 关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量
方法(函数): 返回值 方法名(参数类型 参数名称, ...){ 方法体(代码块) } this指调用的方法中(当前)的变量 类与对象 1.构造方法: 1> 构造对象 构造实例的方法,一个特殊方法,方法名需要与类名相同,并且没有返回值 2> 当在类中创建构造方法后,jvm将不再为类生成生成默认的构造方法。 2.成员变量和局部变量 成员变量:(直接在类中声明的变量) 作用域:在整个类中都有效 初始值:如果未对成员变量设置初始值,则系统会根据成员变量的类型自动分配初始值 使用: 1. 如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在同名局部变量 所在方法内暂时失效。 2. 如果需要在局部变量有效的作用域内使用同名的成员变量,则必须使用关键字this来引用成员变量。 局部变量:(在方法内或者代码块内定义的变量、方法的参数) 使用:必须先声明再使用。 3.方法重载: 1> 方法重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。 2> 方法的返回值类型和参数的名字不参与比较,也就是说如果两个方法的名字相同,即使返回值类型或者是参数的名字不同,也不能称为方法的重载,必须是参数个数或者是参数类型不同。 4.实例变量和类变量 1> 当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类的实例成员变量不会被分配内存。但是,类中的类变量,在该类被加载到内存时,就分配了相应的内存空间。 2> 如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配内存,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内存空间直到程序退出运行,才释放所占有的内存。 5.实例方法和类方法 1> 当类的字节码文件被加载到内存时。类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址。也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。 2> 对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。
在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块。
关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。
同步值之synchronized和volatile的区别 相同点: synchronized 和 volatile都能用来同步共享变量 不同点: 1. volatile是轻量级的同步策略, 可以修饰基本类型的变量,如int, synchronized是重量级的同步策略,基于对象的同步锁 2. volatile不具备互斥性, 一个线程访问共享变量 , 其他线程也可以访问共享变量 synchronized是互斥锁, 具备互斥性, 在被锁的代码块上只能有一个线程访问共享变量 3. volatile不能保证变量的原子性, 即一组对共享变量的操作不具备事务(要么全部完成,要么全部不完成) 如 i++/i-- 即一个线程在进行一组操作中还没完成时, 其他线程也能进入这组操作对共享变量进行修改 而 synchronized则能保证一组对共享变量操作的原子性, 即这组操作全部完成,才能进行下一轮操作 即在被锁的代码块中只能允许一个线程去执行这组操作, 其他需要执行这组操作的线程会进入阻塞状态,等待其完成 总结:
3.当成员被static修饰之后,就多了一种访问方式,除了可以被对象调用之外,还可以直接
JVM内部使用的Java内存模型在线程栈和堆之间划分内存。此图从逻辑角度说明了Java内存模型:
通常情况下在测试类中可以给成员变量赋值一些合法但不合理的数值,无论在编译阶段还是运行阶段都不会给出任何的提示,此时与现实生活不符。
public: 访问权限修饰符,表示最大的访问权限,被 jvm 调用,所有权限要够大。 static: 被 jvm 调用,不用创建对象,直接类名访问 void: 被 jvm 调用,不需要给 jvm 返回值 main: 一个通用的名称,虽然不是关键字,但是被 jvm 识别 String[] args: 早期出现是为了接收键盘录入数据的。
static成员变量又称为静态成员变量,在多个对象间共享使用,并且static静态变量在初始化时必须在类外初始化,可以直接通过“类名::变量”访问,哪怕是还没有生成对象时一样可以访问,以此看来static成员变量不隶属于某个对象,而隶属于类,只是所有该类的对象都可以使用而已。
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它
享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。 例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:深入理解构造函数,介绍友元函数,内部类等等
在JSP中用两种声明变量的方法,一种是在<%! %>内,一种是在<% %>内。他们之间有什么区别呢?我们直接看一个JSP文件来理解。
07.01_面向对象(构造方法概述和格式) A:构造方法概述和作用 给对象的数据(属性)进行初始化 B:构造方法格式特点 a:方法名与类名相同(大小也要与类名一致) b:没有返回值类型,连void都没有 c:没有具体的返回值 07.02_面向对象(构造方法的重载及注意事项) A:案例演示 构造方法的重载 B:构造方法注意事项 a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。 b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。 注意:这个时候,如果我们还想使用无参构造方法,
类和面向对象 特点: 1,面向对象就是一种常见的思想。符合人们的思考习惯。 2,面向对象的出现,将复杂的问题简单化。 3,面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者。 成员变量和局部
在C++的学习中,可以把类当作一个模具,类所实例化出来的对象就是根据这个模具所产生的实体,对象可以看作是我们自己创建的一个新的数据类型。本文主要介绍了类对象通过拷贝函数进行初始化,分析了类对象的内存模型,以及通过this指针来实现更复杂的功能。最后介绍了析构函数的基础知识。
其实这些变量都之所以叫局部变量,其作用域也只限于声明它的方法体内。在方法被调用时,这些局部变量获得内存空间,到方法执行结束时,他们所占据的内存空间就被释放。
领取专属 10元无门槛券
手把手带您无忧上云