java静态变量与全局变量区别及存放位置
JAVA基础之局部变量与全局变量以及成员变量的区别
JAVA基础之局部变量与全局变量以及成员变量的区别局部变量
定义:在⽅法内定义的变量称为“局部变量”或“临时变量”,⽅法结束后局部变量占⽤的内存将被释放。
全局变量
定义:全局变量,⼜称“外部变量”,它不是属于哪个⽅法,作⽤域从定义的地址开始到源⽂件结束。
注意事项:
当局部变量与全局变量重名时,起作⽤的是局部变量。
成员变量
定义:在类体的变量部分中定义的变量,也称为字段。
区别:
java中没有全局变量的定义,这是C中的
例:
class Demo{
int x;// ⾮静态成员变量,⼜称为属性,对该类不同的对象来说,属性是不同的
static int y;// 静态成员变量,⼀个类中只有⼀个该变量,该类不同的对象共享同⼀个静态成员变量
public static void main(String[] args){
int m = 0;// 局部变量,是⽅法内部定义的变量,只在⽅法内部可见,在该⽅法结束后,由垃圾回收器⾃动回收
}
}。
Java中主类中定义方法加static和不加static的区别
Java中主类中定义⽅法加static和不加static的区别Java中主类中定义⽅法加static和不加static的区别(前者可以省略类名直接在主⽅法调⽤(类名.⽅法),后者必须先实例化后⽤实例调⽤)知识点:1.Getter and Setter 的应⽤2.局部变量与成员变量(也可叫做全局变量)3.Static关键字的⽤法a.成员变量被static修饰后的所有类的共享属性b.⽅法被static修饰之后,在本类内调⽤的类名省略问题;以及不⽤Static,即使在本类内也必须先实例化4.This关键字的⽤法this:是当前类的对象引⽤。
简单的记,它就代表当前类的⼀个对象。
注意:谁调⽤这个⽅法,在该⽅法内部的this就代表谁。
this的场景:解决局部变量隐藏成员变量*///定义学⽣类class Person{//姓名private String name="刘德华";//年龄private int age=45;//所有对象共享的属性⽤static修饰,可以直接被类名直接调⽤static String country = "中国";//姓名获取值public String getName(){return name;}//姓名设置值public void setName(String name){ //name = "林青霞";//name = name; //变量的使⽤规则:就近原则//这⾥是类名,⽬前还没有说过类似的⽤法,所以这个是有问题的//这⾥的调⽤只能通过对象名//这个对象如果存在,它应该代表的是Student的⼀个对象。
//那么,谁能够代表当前类的对象呢? java就提供了⼀个关键字 this// = name; = name;}//年龄获取值public int getAge(){return age;}//年龄赋值public void setAge(int age){this.age = age;}}//测试类public class PersonClass{public void show()//定义⾮静态⽅法,必须经过实例化后才能调⽤{System.out.println("哈哈");}public static void show2()//但是当以静态⽅法后,可以直接⽤类名.函数名//调⽤,在本类内,类名可以忽略,这就是常见的public static...的由来{System.out.println("哈哈你妹");}public static void main(String[] args){//创建⼈对象Person s1= new Person();Person s2= new Person();PersonClass s3=new PersonClass();s3.show();//不能直接写show(),因为是⾮静态⽅法,必须实例化后通过实例调⽤show2();//给成员变量赋值s1.setName("林青霞");s1.setAge(27);s1.country="美国";//静态变量的值是共享的,所以以最后⼀次修改的为准,即全变成了⽇本 s2.country="⽇本";//静态属性最好⽤类名直接调⽤,要不会警告的哦//Static 与Final是不同的哦,Static类似C语⾔的Extern,Final类似Define//Static定义的变量的值仍然是可以修改的,但是Final指定在定义的时候赋值⼀次//获取数据System.out.println(s1.getName()+"---"+s1.getAge());//直接⽤类名.调⽤Name和// age是绝对不可以的System.out.println(s2.getName()+"---"+s2.getAge());System.out.println(s1.country);//静态属性最好不要⽤类的实例调⽤,会警告的System.out.println(s2.country);System.out.println(Person.country);//Person.后⾯只提⽰country,//不会提⽰name和age哦}}。
static全局变量与普通的全局变量有什么区别
(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。
(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。
(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。
Static全局变量与普通的全局变量有什么区别:1.static全局变量只初使化一次,防止在其他文件单元中被引用;2.static局部变量只被初始化一次,下一次依据上一次结果值;3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝const关键字在C语言中用于声明”只读变量”,其值不可修改,但具有确定的数据类型。
C 编译器总是为其分配相应的存储单元。
在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。
在C++中,还可以修饰类的成员函数,不改变类中的数据成员.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *pASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。
如果表达式不为0,则继续执行后面的语句。
这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了就终止程序以免导致严重后果,同时也便于查找错误。
例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:const作用:修饰变量、修饰函数参数、修饰函数返回值三个作用。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1)const变量有数据类型,而宏常量没有数据类型。
Java经典面试笔试题及答案
1.什么是对象序列化,为什么要使用?所谓对象序列化就是把一个对象以二进制流的方式保存到硬盘上。
好处:方便远程调用。
2.值传递与引用传递的区别?所谓值传递就是把一个对象的值传给一个新的变量,但是系统会给这个新的变量开辟一个新的内存空间。
不会改变原有的值所谓引用传递就是把一个对象在堆中保存的数据传递给一个变量,此时新的变量与原有的变量对应同一个内存存储空间,当新的变量修改对象的属性时,内存中的数据也会修改。
3.接口与抽象类的区别?1:接口里面不可以实现方法体,抽象类可以实现方法体。
2:接口可以多继承接口,抽象类不可以。
3:接口需要被子类实现,抽象类是要被子类继承(单一继承)。
4:接口中只能有公有的方法和属性而且必须赋初始值,抽象类中可以有私有方法和属性.5: 接口中不能存在静态方法,但属性可以和final,抽象类中方法中可以有静态方法,属性也可以。
4.谈谈继承,为什么要使用继承?所谓继承就是找出几个类中共同的部分,提取出来作为父类。
而子类只需要继承父类,就可以共享父类的方法。
使用继承能够减少重复的代码。
5.方法重载的好处?所谓重载就是在一个类中可以定义多个相同的方法,但是方法的参数类型和参数的个数以及顺序要不同。
重载的好处就是能够让我们很快的掌握该方法的功能,我们只要要记住该方法就能很快的理解该方法的参数以及参数的作用6.项目中印象最深的部分?我觉得在该项目中我体现到了反射技术的强大之处,原来我一直不清楚反射是一种什么样的技术,只知道一些概念上的知识,经过这个项目之后,终于知道该怎样灵活运用反射,以及在什么时候运用。
谈谈你对面向对象的理解与认识?我觉得使用面向对象这种思维的方式比较符合我们人类的思想,不需要去学习一些什么新的思考方式,就按照现实生活做的一些故事就能让人理解该内容的知识以及他们的作用。
我的看法就是:1:当加入新的功能的时候不会修改原有的代码。
(面向接口编程) 2: 当我们写的一个类可以重复的运用在其他项目中。
Java中static关键字的作用和用法详细介绍
Java中static关键字的作⽤和⽤法详细介绍static表⽰“全局”或者“静态”的意思,⽤来修饰成员变量和成员⽅法,也可以形成静态static代码块,但是Java语⾔中没有全局变量的概念。
被static修饰的成员变量和成员⽅法独⽴于该类的任何对象。
也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运⾏时数据区的⽅法区内定找到他们。
因此,static对象可以在它的任何对象创建之前访问,⽆需引⽤任何对象。
⽤public修饰的static成员变量和成员⽅法本质是全局变量和全局⽅法,当声明它类的对象市,不⽣成static变量的副本,⽽是类的所有实例共享同⼀个static变量。
static变量前可以有private修饰,表⽰这个变量可以在类的静态代码块中,或者类的其他静态成员⽅法中使⽤(当然也可以在⾮静态成员⽅法中使⽤–废话),但是不能在其他类中通过类名来直接引⽤,这⼀点很重要。
实际上你需要搞明⽩,private是访问权限限定,static表⽰不要实例化就可以使⽤,这样就容易理解多了。
static前⾯加上其它访问权限关键字的效果也以此类推。
static修饰的成员变量和成员⽅法习惯上称为静态变量和静态⽅法,可以直接通过类名来访问,访问语法为:类名.静态⽅法名(参数列表…)类名.静态变量名⽤static修饰的代码块表⽰静态代码块,当Java虚拟机(JVM)加载类时,就会执⾏该代码块(⽤处⾮常⼤,呵呵)。
1、static变量按照是否静态的对类成员变量进⾏分类可分两种:⼀种是被static修饰的变量,叫静态变量或类变量;另⼀种是没有被static修饰的变量,叫实例变量。
两者的区别是:对于静态变量在内存中只有⼀个拷贝(节省内存),JVM只为静态分配⼀次内存,在加载类的过程中完成静态变量的内存分配,可⽤类名直接访问(⽅便),当然也可以通过对象来访问(但是这是不推荐的)。
你知道嵌入式c中各变量存储位置吗
你知道嵌入式c中各变量存储位置吗
局部变量,局部静态变量,全局变量,全局静态变量区别:
局部变量:栈区
局部静态变量:静态区
全局变量:静态区的常量区
全局静态变量:静态区
在进行C++/C++编程时,需要程序员对内存的了解比较精准。
经常需要操作的内存可分为以下几个类别:
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS 回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。
程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
以下是一段实际说明的程序代码:
这是一个前辈写的,非常详细
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈。
程序运行时的存储组织方式
程序运行时的存储组织方式通常包括以下几个部分:
代码区:也称为文本区或代码段,用于存放程序的二进制代码。
这部分通常只读,以防止程序在运行时被修改。
数据区:用于存放静态变量和全局变量。
这些变量在程序的生命周期内保持不变。
堆:用于动态分配内存。
当程序运行时,如果需要动态分配内存,比如为数组或结构体分配内存,那么会从堆中分配。
当不再需要这些内存时,通常会手动释放这些内存,以便让系统可以重用这些资源。
栈:用于存放局部变量和函数调用的信息。
每当一个函数被调用时,它的参数、返回地址和局部变量都会被压入栈中。
当函数返回时,这些信息会被从栈中弹出。
其他数据结构:根据程序的需要,还可能使用其他的数据结构来存储和管理数据,比如队列、链表、哈希表等。
这种存储组织方式有助于提高程序的效率和安全性。
例如,代码区只读可以防止恶意代码的注入;数据区和堆的分离可以防止内存泄漏;栈的自动管理可以减少内存管理的复杂性;而其他数据结构则可以根据需要灵活地存储和管理数据。
局部变量与全局变量区别栈、堆和静态存储区的区别
从作用域看:全局变量具有全局作用域.全局变量只需在一个源文件中定义,就可以作用于所有地源文件.当然,其他不包括全局变量定义地源文件需要用关键字再次声明这个全局变量.个人收集整理勿做商业用途静态局部变量具有局部作用域.它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量地区别在于全局变量对所有地函数都是可见地,而静态局部变量只对定义自己地函数体始终可见.个人收集整理勿做商业用途局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数地一次调用结束后,变量就被撤销,其所占用地内存也被收回.个人收集整理勿做商业用途静态全局变量也具有全局作用域,他与全局变量地区别在于如果程序包含多个文件地话,他作用于定义它地文件里,不能作用到其他文件里,即被关键字修饰过地变量具有文件作用域.这样即使两个不同地源文件都定义了相同地静态全局变量,他们也是不同地变量.个人收集整理勿做商业用途从分配内存空间看:全局变量、静态局部变量、静态全局变量都在静态存储区分配空间,而局部变量在栈分配空间.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上没有什么不同.区别在于非静态全局变量地作用域是整个源程序,当一个源程序由多个源文件组成时,非静态地全局变量在各个源文件中都是有效地.而静态全局变量则限制了其作用域,即只在定义该变量地源文件内有效,在同一源程序地其他源文件中不能使用它.由于静态全局变量地作用域局限于一个源文件内,只能为该源文件内地函数公用,因此可以避免在其他源文件中引起错误.个人收集整理勿做商业用途、静态变量会被放在程序地静态数据存储区里,这样可以在下一次调用地时候还可以保持原来地赋值.这一点是他与堆栈变量和堆变量地区别个人收集整理勿做商业用途、变量用告知编译器,自己仅仅在变量地作用域范围内可见.这一点是他与全局变量地区别.从以上分析可以看出,把局部变量改变为静态变量后是改变了他地存储方式,即改变了他地生存期.把全局变量改变为静态变量后是改变了他地作用域,限制了他地使用范围,因此这个说明符在不同地地方起地作用是不同地.个人收集整理勿做商业用途:、若全局变量仅在单个文件中访问,则可以讲这个变量修改为静态全局变量.、若全局变量仅在单个函数中使用,则可以将这个变量修改为该函数地静态局部变量.、全局变量、静态局部变量、静态全局变量都存放在静态数据存储区.、函数中必须要使用变量地情况:当某函数地返回值为指针类型时,则必须是地局部变量地地址作为返回值,若为类型,则返回为错指针.个人收集整理勿做商业用途个人收集整理勿做商业用途预备知识—程序地内存分配一个由编译地程序占用地内存分为以下几个部分栈区()—由编译器自动分配释放,存放函数地参数值,局部变量地值等.其操作方式类似于数据结构中地栈. 个人收集整理勿做商业用途堆区()—一般由程序员分配释放,若程序员不释放,程序结束时可能由回收 .注意它与数据结构中地堆是两回事,分配方式倒是类似于链表. 个人收集整理勿做商业用途全局区(静态区)()—,全局变量和静态变量地存储是放在一块地,初始化地全局变量和静态变量在一块区域,未初始化地全局变量、未初始化地静态变量在相邻地另一块区域. 程序结束后有系统释放个人收集整理勿做商业用途文字常量区—常量字符串就是放在这里地.程序结束后由系统释放程序代码区—存放函数体地二进制代码.一个正常地程序在内存中通常分为程序段、数据端、堆栈三部分.程序段里放着程序地机器码、只读数据,这个段通常是只读,对它地写操作是非法地.数据段放地是程序中地静态数据.动态数据则通过堆栈来存放.个人收集整理勿做商业用途在内存中,它们地位置如下:内存低端程序段数据段堆栈内存高端个人收集整理勿做商业用途堆栈是内存中地一个连续地块.一个叫堆栈指针地寄存器()指向堆栈地栈顶.堆栈地底部是一个固定地址.堆栈有一个特点就是,后进先出.也就是说,后放入地数据第一个取出.它支持两个操作,和.是将数据放到栈地顶端,是将栈顶地数据取出.在高级语言中,程序函数调用、函数中地临时变量都用到堆栈.为什么呢?因为在调用一个函数时,我们需要对当前地操作进行保护,也为了函数执行后,程序可以正确地找到地方继续执行,所以参数地传递和返回值也用到了堆栈.通常对局部变量地引用是通过给出它们对地偏移量来实现地.另外还有一个基址指针(,在芯片中是),许多编译器实际上是用它来引用本地变量和参数地.通常,参数地相对地偏移是正地,局部变量是负地.当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器()中地内容,做为返回地址();第三个放入堆栈地是基址寄存器();然后把当前地栈指针()拷贝到,做为新地基地址;最后为本地变量留出一定空间,把减去适当地数值.在函数体中定义地变量通常是在栈上,用, , 等分配内存地函数分配得到地就是在堆上.在所有函数体外定义地是全局量,加了修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义地变量表示在该文件中有效,不能到别地文件用;在函数体内定义地表示只在该函数体内有效.另外,函数中地""这样地字符串存放在常量区.对比:个人收集整理勿做商业用途性能栈:栈存在于中.栈是动态地,它地存储速度是第二快地.堆:堆位于中,是一个通用地内存池.所有地对象都存储在堆中.申请方式【栈】: 由系统自动分配. 例如,声明在函数中一个局部变量; 系统自动在栈中为开辟空间 .【堆】: 需要程序员自己申请,并指明大小,在中函数如( *)(); 在中用运算符如( *)(); 但是注意:、本身是在栈中地.申请后系统地响应栈【】:只要栈地剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出. 个人收集整理勿做商业用途堆【】:首先应该知道操作系统有一个记录空闲内存地址地链表,当系统收到程序地申请时,会遍历该链表,寻找第一个空间大于所申请空间地堆结点,然后将该结点从空闲结点链表中删除,并将该结点地空间分配给程序;另外,对于大多数系统,会在这块内存空间中地首地址处记录本次分配地大小,这样,代码中地语句才能正确地释放本内存空间.另外,由于找到地堆结点地大小不一定正好等于申请地大小,系统会自动地将多余地那部分重新放入空闲链表中.申请大小地限制栈【】:在下,栈是向低地址扩展地数据结构,是一块连续地内存地区域.这句话地意思是栈顶地地址和栈地最大容量是系统预先规定好地,在下,栈地大小是(也有地说是,总之是一个编译时就确定地常数),如果申请地空间超过栈地剩余空间时,将提示.因此,能从栈获得地空间较小. 个人收集整理勿做商业用途堆【】:堆是向高地址扩展地数据结构,是不连续地内存区域.这是由于系统是用链表来存储地空闲内存地址地,自然是不连续地,而链表地遍历方向是由低地址向高地址.堆地大小受限于计算机系统中有效地虚拟内存.由此可见,堆获得地空间比较灵活,也比较大.申请效率地比较栈【】:由系统自动分配,速度较快.但程序员是无法控制地. 个人收集整理勿做商业用途堆【】:是由分配地内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.另外,在下,最好地方式是用分配内存,他不是在堆,也不是在栈是直接在进程地地址空间中保留一快内存,虽然用起来最不方便.但是速度快,也最灵活.堆和栈中地存储内容栈【】:在函数调用时,第一个进栈地是主函数中后地下一条指令(函数调用语句地下一条可执行语句)地地址,然后是函数地各个参数,在大多数地编译器中,参数是由右往左入栈地,然后是函数中地局部变量.注意静态变量是不入栈地. 个人收集整理勿做商业用途当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存地地址,也就是主函数中地下一条指令,程序由该点继续运行.堆【】:一般是在堆地头部用一个字节存放堆地大小.堆中地具体内容有程序员安排.存取效率地比较[] "";* "";是在运行时刻赋值地;而是在编译时就确定地;但是,在以后地存取中,在栈上地数组比指针所指向地字符串(例如堆)快.比如:(){;[] "";* "";[];[];;}对应地汇编代码: [];[][]: [];[][][]第一种在读取时直接就把字符串中地元素读到寄存器中,而第二种则要先把指针值读到中,在根据读取字符,显然慢了.小结:堆和栈地区别可以用如下地比喻来看出:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他地好处是快捷,但是自由度小.使用堆就象是自己动手做喜欢吃地菜肴,比较麻烦,但是比较符合自己地口味,而且自由度大.个人收集整理勿做商业用途。
全局变量与局部变量的区别
s=a+b; ……b 作用域 } …… s,a 作用域 } [例 5.11]main() { int i=2,j=3,k; k=i+j; { int k=8; if(i==3) printf("%d\n",k); } printf("%d\n%d\n",i,k); } main() { int i=2,j=3,k; k=i+j; { int k=8; if(i=3) printf("%d\n",k);
Байду номын сангаас
自动变量和寄 存器变量 属于 动态存储 方式 , 外部变量和静态变 量属于静态存储方式。在介绍了变量的存储类型之 后, 可以知道对 一个变量的说明不仅应说明 其数 据类型, 还应说明 其存储类型。 因 此变量说明的 完整 形式应为: 存储类型说明符 数据类型说明 符 变
量名,变量名…; 例如: static int a,b; auto char c1,c2; static int a[5]={1,2,3,4,5}; extern int x,y; 说明 a,b 为静态类型变量 说明 c1,c2 为自动字符变量 说明 a 为静整型数组 说明 x,y 为外部整型变量。
总结与区别: 变量根 据定义的位置的不同 的生命周 期, 具有不同的 作用域, 作用域可分为 6 种: 全局作用域,局部作用域,语句作用域, 类作用域,命名空间作用域和文件作用域。 从作用域看: 全局变量具有全局作用域。全局变量只需 在一个源文件 中定义,就可 以作用于所有的源文件。当然,其 他不包含全局变量定义的源 文件需 要用 extern 关键字再次声 明这个全局变量。 静态局部变量具有局部作用域,它只 被初始化一次,自从第一次被初 始化直到程序运行结束都一直存在, 它和全局变量的区别在于 全局变 量对所有的函数都是可见的, 而静态局部变量只 对定义自己的函数体 始终可见。
java面试基础知识
java面试基础知识java面试基础知识1、静态变量和实例变量的区别?在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量是属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配内存空间,才可以使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会分配内存空间,而且只分配一次,静态变量就可以被使用了。
总之,实例变量必须创建后才可以通过这个对象来使用,静态变量则直接可以使用类名来调用。
2、什么是反射机制?java反射是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法,对于任何一个对象,都能够调用它的任意一个属性和方法,这种动态获取信息以及动态调用对象的方法的功能称为java的反射机制。
3、什么是装箱?什么是拆箱?装箱:自动将基本数据类型转换为包装器类型。
拆箱:自动将包装器类型转换为基本数据类型。
4、Java 中覆盖和重载是什么意思?覆盖(Override)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小,被覆盖的方法不能是private的,否则只是在子类中重新定义了一个新方法。
重载(Overload)表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。
java基础知识面试题及答案1、static关键字什么意思?java中是否可以覆盖一个private或者是static的方法?“static”表明一个成员变量或者是成员方法可以在没有所属类的实例变量的情况下访问。
java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
static方法与类的任何实例都不相关。
java中不可以覆盖private方法。
因为private修饰的变量和方法只能在当前类中使用,如果是其他类继承当前类,继承类中是不能访问到private变量和方法的。
java入门---对象和类概念详解实例
java⼊门---对象和类概念详解实例Java作为⼀种⾯向对象语⾔。
⽀持以下基本概念:多态继承封装抽象类对象实例⽅法重载这篇⽂章,我们主要来看下:对象:对象是类的⼀个实例(对象不是找个⼥朋友),有状态和⾏为。
例如,⼀条狗是⼀个对象,它的状态有:颜⾊、名字、品种;⾏为有:摇尾巴、叫、吃等。
类:类是⼀个模板,它描述⼀类对象的⾏为和状态。
下图中男孩⼥孩为类,⽽具体的每个⼈为该类的对象:现在让我们深⼊了解什么是对象。
看看周围真实的世界,会发现⾝边有很多对象,车,狗,⼈等等。
所有这些对象都有⾃⼰的状态和⾏为。
拿⼀条狗来举例,它的状态有:名字、品种、颜⾊,⾏为有:叫、摇尾巴和跑。
对⽐现实对象和软件对象,它们之间⼗分相似。
软件对象也有状态和⾏为。
软件对象的状态就是属性,⾏为通过⽅法体现。
在软件开发中,⽅法操作对象内部状态的改变,对象的相互调⽤也是通过⽅法来完成。
接下来,我们来看下类。
类可以看成是创建Java对象的模板,通过下⾯⼀个简单的类来理解下Java中类的定义:public class Dog{String breed;int age;String color;void barking(){}void hungry(){}void sleeping(){}}⼀个类可以包含以下类型变量:局部变量:在⽅法、构造⽅法或者语句块中定义的变量被称为局部变量。
变量声明和初始化都是在⽅法中,⽅法结束后,变量就会⾃动销毁。
成员变量:成员变量是定义在类中,⽅法体之外的变量。
这种变量在创建对象的时候实例化。
成员变量可以被类中⽅法、构造⽅法和特定类的语句块访问。
类变量:类变量也声明在类中,⽅法体之外,但必须声明为static类型。
⼀个类可以拥有多个⽅法,在上⾯的例⼦中:barking()、hungry()和sleeping()都是Dog类的⽅法。
然后我们来看下构造⽅法。
每个类都有构造⽅法。
如果没有显式地为类定义构造⽅法,Java编译器将会为该类提供⼀个默认构造⽅法。
全局变量和静态变量
c++和C的划分存储区有点不一样。大概可以分为下面5个:
全局/静态区。常量区。自由存储区(new的地方),堆栈(局部变量),堆(malloc)的地方。
其实我觉得自由存储和heap应该差不多。从这点看。全局和静态地方是一样的。可是不能
从这点就说这两个变量是一样的。最起码局部变量都是以静态存储方式存储的。但全局变量具有外部连接性,即同一工程中其它文件中的也可引用。而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。
static静态变量的理解
static静态变量的理解静态变量类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。
静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。
另外,属于静态存储方式的量不一定就是静态变量。
例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,而且它会保持最新的值。
说其静态,是因为它不会随着函数的调用和退出而发生变化。
即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
一、静态局部变量:1、 Static类内部变量同auto自动变量(即未加 Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。
倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。
换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。
全局变量、成员变量、类变量、静态变量、实例变量、局部变量的定义与区别
全局变量、成员变量、类变量、静态变量、实例变量、局部变量的定义与区别private int i;//实例变量private static int j;//类变量实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同。
⽽由static修饰的类变量(静态变量)在类装载的时候就会被初始化,也就是说⼀处修改多处改变.局部变量⽅法内定义的变量叫局部变量,因为只能在⽅法内部使⽤,固不可以⽤private,public,protect来修饰。
{int k;//局部变量}类变量类变量:⼜叫静态变量⽤static修饰它可以直接⽤类名调⽤也可以⽤对象调⽤⽽且所有对象的同⼀个类变量都是共享同⼀块内存空间的.实例变量实例变量:不⽤static修饰它只能通过对象调⽤⽽且所有对象的同⼀个实例变量是共享不同的内存空间的.下⾯是它们之间的思维导图关系。
全局变量和局部变量的区别全局变量:1、成员变量定义在类中,在整个类中都可以被访问。
2、成员变量随着对象的建⽴⽽建⽴,随着对象的消失⽽消失,存在于对象所在的堆内存中。
(实例变量)3、成员变量有默认初始化值。
局部变量:1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2、局部变量存在于栈内存中,作⽤的范围结束,变量空间会⾃动释放。
3、局部变量没有默认初始化值实例变量和类变量的区别1、两个变量的⽣命周期不同实例变量随着对象的创建⽽存在,随着对象的回收⽽释放。
静态变量随着类的加载⽽存在,随着类的消失⽽消失。
2、调⽤⽅式不同实例变量只能被对象调⽤。
静态变量可以被对象调⽤,还可以被类名调⽤。
3、数据存储位置不同实例变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在⽅法区(共享数据区)的静态区,所以也叫对象的共享数据。
局部变量、全局变量、堆、堆栈、静态和全局变量
局部变量、全局变量、堆、堆栈、静态和全局变量一般全局变量存放在数据区,局部变量存放在栈区,动态变量存放在堆区,函数代码放在代码区。
---------------------------------------------------------------栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了---------------------------------------------------------------栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率>有一定降低。
栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。
不同堆分配的内存无法互相操作。
栈空间分静态分配和动态分配两种。
静态分配是编译器完成的,比如自动变量(auto)的分配。
动态分配由malloca函数完成。
栈的动态分配无需释放(是自动的),也就没有释放函数。
为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/ 释放内存匹>配是良好程序的基本要素。
堆是程序员管理的,栈是系统管理的.另外关于静态和全局的一些问题:静态变量的特点:1、一次存储:静态局部变量只被初始化一次,下一次初始化根据上一次的结果值,有点类似于c++中类的静态成员变量,即无论该类型生成多少个实例对象,所有的对象共用一个静态变量,到这里就是无论这个函数调用多少次,该静态变量只初始化一次,并没有因为超出其生存期而被销毁,只是外部不可见而已,用个例子说明之:void fun1( int v ){static int value = v;static int value = v;}int main( int arc, char*args[ ]){fun1( 50 );fun1( 100 );}执行的结果是:value : 50 value : 50说明在第二次调用fun1( )时的初始化value的采用的是上一次value的值,value在静态区的存储空间并没有因为fun1( )的结束而被释放,即体现了一次存储;2、作用域限定:静态修饰的作用域限定功能同时体现在函数与变量上;a)对于函数而言,任何用static修饰的函数,其作用域仅为当前源文件,而对外部来说这个函数是不可见的,即只有和其在同一源文件中的函数才能调用这个静态函数;反过来说,如果一个函数仅仅被同一源文件中的其他函数调用,那么这个函数应该声明为静态的,这样做的好处在于:可以一定程度上的解决不同源文件之间函数的命名冲突问题;b)对于变量而言,static修饰的全局变量,只在当前源文件中有效,对外部不可见,外部文件不能够引用;顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量;同静态变量一样,全局变量位于静态数据区,全局变量一处定义,多处引用,用关键字“extern”引用“外部”的变量。
静态变量与非静态变量的区别
{
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
Console.ReadLine();
}
}
关于C#静态构造函数的几点说明:
静态构造函数是C#的一个新特性,其实好像很少用到 。不过当我们想初始化一些静态变量的时候就需要用到它了 。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次 。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用 。
5.访问方式
静态成员不能访问非静态成员;非静以后创建的对象都使用的该内存,相应的操作也就是对这块内存进行操作 。也可以看作是另类的全局变量 。
在WebSerivice中想只进行一次初始化,而不用每次都进行初始化这样占用大量资源 。还可以对调用的服务进行管理,比如想把每次调用的服务进行排队执行,可以将想应信息放到Arraylist中,静态时钟中排队执行 。
2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了 。
3、一个类只能有一个静态构造函数 。
4、无参数的构造函数可以与静态构造函数共存 。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突 。
// 转到初始值设定项---->
{
Console.WriteLine("static B()");
}
static void Main() //① 程序入口,
// 如果类中包含用来开始执行的 Main 方法,
static变量用法
static变量用法
static变量用法:
1. 在类中定义的静态变量是与类本身紧密相关的变量,被所有该类的实例对象所共享。
无论创建多少该类的对象,静态变量只有一份拷贝。
2. 静态变量可以被类的所有方法访问,包括静态方法和非静态方法。
它属于类,在类被加载时就存在,无需创建对象就可以使用。
3. 静态变量的值可以被类的任何对象改变,一次改变,所有对象都会受到影响。
4. 静态变量可以通过类名来引用,也可以通过对象名来引用,但建议使用类名引用。
5. 静态变量的生命周期与类相同,在类被卸载时消失。
6. 静态变量通常用于存储与类相关的常量,如π、版本号等。
7. 静态变量一般使用public或private修饰符,public修饰符可以被其他类直接访问,private修饰符只能在类内部访问。
8. 静态变量可以用final修饰,表示常量,一旦赋值就不能改变,一般命名时使用全大写。
9. 静态变量可以不被初始化,默认值为0或null,具体取决于变量类型。
10. 静态变量可以有多个实例,每个实例的值不互相影响,仅仅在该类的所有实例中共享。
Java中的static修饰int值做全局变量与static修饰词初始化顺序
Java中的static修饰int值做全局变量与static修饰词初始化顺序先看⼀道题1public class HasStatic{2private static int x=100;3public static void main(String args[]){4 HasStatic hs1=new HasStatic();5 hs1.x++;6 HasStatic hs2=new HasStatic();7 hs2.x++;8 hs1=new HasStatic();9 hs1.x++;10 HasStatic.x--;11 System.out.println("x="+x);12 }13 }这个题的考察点主要是在static关键字上⾯static修饰的全局变量到底是在什么时候创建的?这个题⾥⾯⼀共是有⼏个不同对象的x属性还是其他的什么呢?下⾯附上⼀张我学JavaSE时候关于static关键字的PPT截图通过这个图上⾯的知识点就很容易计算上⾯的题⽆论哪个对象操作了x这个全局变量,x的值都是在改变的 x最后的取值应该为102那么扩展起来这个知识点联想⼀下 static修饰的⽅法属性代码块都是什么时候创建的呢?⾸先我们看java中类的⽣命周期java中类的⽣命周期为装载、连接、初始化、使⽤和卸载五个过程,如下图所⽰:1.加载我们编写⼀个java的源⽂件,经过编译后⽣成⼀个后缀名为.class的⽂件,这结合四字节码⽂件,java虚拟机就识别这种⽂件,java的⽣命周期就是class⽂件从加载到消亡的过程。
关于加载,其实,就是将源⽂件的class⽂件找到类的信息将其加载到⽅法区中,然后在堆区中实例化⼀个ng.Class对象,作为⽅法区中这个类的信息的⼊⼝。
但是这⼀功能是在JVM之外实现的,主要的原因是⽅便让应⽤程序⾃⼰决定如何获取这个类,在不同的虚拟机实现的⽅式不⼀定相同,hotspot虚拟机是采⽤需要时在加载的⽅式,也有其他是先预先加载的。
java静态变量与全局变量区别及存放位置
java静态变量与全局变量区别及存放位置java静态变量存放区静态的意思:只有⼀份!不存在拷贝!虚拟机内存分为四个区:stack segment,heap segment,data segment,code segment;stack 区存放函数参数和局部变量;heap 区存放对象;data 区存放static 的变量或者字符串常量;code 区存放类中的⽅法;所以,静态变量是存放在data区的静态变量属于类的属性。
⾄于他放在那⾥?有⼈说的是静态区。
我不知道到底有没有这个翻译。
但是深⼊jvm⾥是是翻译为⽅法区的。
虚拟机的体系结构:堆,⽅法区,本地⽅法栈,pc寄存器。
⽽⽅法区保存的就是⼀个类的模板,堆是放类的实例的。
栈是⼀般来⽤来函数计算的。
随便找本计算机底层的书都知道了。
栈⾥的数据,函数执⾏完就不会存储了。
这就是为什么局部变量每⼀次都是⼀样的。
就算给他加⼀后,下次执⾏函数的时候还是原来的样⼦。
static函数与普通函数有什么区别:static函数在内存中只有⼀份,普通函数在每个被调⽤中维持⼀份拷贝全局变量和静态变量的区别:全局变量在整个⼯程⽂件内都有效;静态全局变量只在定义它的⽂件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配⼀次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。
全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。
这两者在存储⽅式上并⽆不同。
这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。
⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
java中静态变量在内存中的位置
java中静态变量在内存中的位置
java程序在内存中的存储分配情况:
⼀、堆区:
1.存储的全部是对象,每个对象都包含⼀个与之对应的class的信息。
(class的⽬的是得到操作指令)
2.jvm只有⼀个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引⽤,只存放对象本⾝
栈区:
1.每个线程包含⼀个栈区,栈中只保存基础数据类型的对象和⾃定义对象的引⽤(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引⽤)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执⾏环境上下⽂、操作指令区(存放操作指令)。
⽅法区:
1.⼜叫静态区,跟堆⼀样,被所有的线程共享。
⽅法区包含所有的class和static变量。
2.⽅法区中包含的都是在整个程序中永远唯⼀的元素,如class,static变量。
⼆、内存分区
⽽内存分为四个区:stack segment,heap segment,data segment,code segment;
stack 区存放函数参数和局部变量;heap 区存放对象;data 区存放static 的变量或者字符串常量; code 区存放类中的⽅法;因此,静态变量是存放在data区的!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所以,静态变量是存放在data区的
静态变量属于类的属性。至于他放在那里?有人说的是静态区。我不知道到底有没有这个翻译。但是 深入jvm里是是翻译为方法区的。虚拟机的体系结构:堆,方法区,本地方法栈,pc寄存器。而方法区保存的就是一个类的模板,堆是放类的实例的。栈是一般来用来函数计算的。随便找本计算机底层的书都知道了。栈里的数据,函数执行完就不会存储了。这就是为什么局部变量每一次都是一样的。就算给他加一后,下次执行函数的时候还是原来的样子。
java静态变量存放区静态的意思:只有一份!不存在拷贝!
虚拟机内存分为四个区:stack segment,heap segment,data segment,code segment;
stack 区存放函数参数和局部变量;
heap 区存放对象;
data 区存放static 的变量或者字符串常量;
static函数与普通函数有什么区别:
static态变量的区别:
全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。