-
2018-10-12 12:18:56
可能从理解上来说确实有点想不通,但是对比C++仔细分析,是有道理的。
大家都知道,C++中是存在全局变量的。而在java中只有加了public static的变量才可以算是全局变量。
我们也知道,全局变量理论上来说(public static),在程序的任何地方都能访问。那么静态成员方法中为什么不能定义静态变量呢?
全局变量上面说过,在程序的任何地方都能访问,我们为什么要把一个全局变量定义在一个方法中?这样是不是有不妥?
成员方法中定义的变量都是局部变量,只能在方法体内访问。而静态变量则是全局变量,(这里暂不考虑private修饰的静态变量)。
不光不能在静态方法中定义静态变量,在非静态方法中更不能。java是不允许这种情况的出现。
更多相关内容 -
php静态成员方法和静态的成员属性的使用方法
2020-12-20 04:25:18静态成员方法和静态的成员属性 如下使用: class wan { public static $time = '1天'; public static function xxx() { echo '这就是一个静态的成员方法'; //在类的内部调用静态的成员属性的时候要使用self... -
static的用法(一):静态成员变量和静态成员方法
2018-03-15 18:02:47被static修饰的成员变量和成员方法独立于该类的任何对象。 被类所有的实例所共享。 当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例对象共用同一个static变量。这也就是说不管创建多少对象,...被static修饰的成员变量和成员方法独立于该类的任何对象。
被类所有的实例所共享。
当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例对象共用同一个static变量。这也就是说不管创建多少对象,static修饰的变量只占有一块内存。
1、静态成员变量:
声明为static关键词修饰的变量叫做静态成员变量,也叫全局变量。
静态成员变量的访问方式:(1)直接通过类名调用类的静态成员变量:
类名.静态成员变量名
(2)通过对象名调用类的静态成员变量:
对象名.静态成员变量名
当成员变量需要在类的实例对象间共享时,使用static修饰成员变量,极为方便。
2、静态成员方法:
声明为static关键词修饰的方法叫做静态成员方法。例如:作为Java应用程序入口的main成员方法就是一个静态成员方法。
静态成员变量的访问方式:
(1)通过类名调用类的静态成员方法:类名.静态成员方法名(成员方法调用参数列表)
(2)通过实例对象名调用类的静态成员方法:
对象.静态成员方法名(成员方法调用参数列表)
在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。
应用实例:
public class MyBook { //声明非静态成员变量 书名 public String book_name ; //声明静态成员变量,为类的所有实例所共享 public static int book_number; //构造函数 public MyBook(String book_name){ this.book_name=book_name; book_number++; } public void print_book_name(){ System.out.println("新买了一本书:"+this.book_name); } //静态成员方法,只能直接调用同类中其他的静态成员 public static void print_book_number(){ System.out.println(MyBook.book_number); } //main方法也是一个静态成员方法 public static void main(String args[]){ //new一本书“三体” MyBook book_1 = new MyBook("三体"); MyBook book_2 = new MyBook("Java程序设计"); //控制台打印第一本书的名字 book_1.print_book_name(); //控制台打印第二本书的名字 book_2.print_book_name(); //book_number为类的实例对象所共有 //打印类对象的静态成员变量 System.out.println("MyBook类中静态成员变量的值为:"); MyBook.print_book_number(); //打印book_1中静态成员变量 System.out.println("book_1中静态成员变量的值为:"); book_1.print_book_number(); //打印book_2中静态成员变量 System.out.println("book_2中静态成员变量的值为:"); book_2.print_book_number(); } }
所以,当一个数据需要给同一类的所有对象使用时,需要用static修饰。
-
普通成员方法和静态成员方法的区别
2018-05-24 00:56:551.静态数据成员我们在了解普通成员方法和静态成员方法之前,先了解一下静态变量。在我们函数栈上定义一个普通变量之后,它的生存周期就是随着函数执行完,栈帧的回退释放掉。优点是封装了数据变量。全局变量的生存...我们在了解普通成员方法和静态成员方法之前,先了解一下静态变量。
静态变量
在我们函数栈上定义一个普通变量之后,它的生存周期就是随着函数执行完,栈帧的回退释放掉。优点是封装了数据变量。全局变量的生存周期是该程序开始执行到该程序结束,作用域是全局下的,全局的函数都可以访问。(这样会引发很多问题因为这个不安全,没有很好的封装)。我们现在想要一个函数定义一个变量之后,该变量在函数执行完后,仍然值不变,且具有隐藏性。这样的话全局变量和普通变量都不满足,就引出了我们静态变量。在一个函数里定义了一个静态变量,我们函数执行完下次继续执行时(这里是程序没结束),静态变量的值不变(且只初始化一次默认为0),其他函数无法直接访问该静态变量。这就是我们静态变量的功能, 值保持,隐藏。
讲了点C语言的内容。也算引出我们要讲的C++的静态数据成员和静态成员函数静态数据成员
静态数据成员是该类所有,该类实例的对象所共有的,类只是数据的一个说明,不占内存,所以静态数据成员不在类中定义,是在类外定义的。也就是在程序一执行就被存放到了数据区了,所以它比对象先生成。我这里先举两个例子示例一:
我们如果要知道一个类共实例了多少个对象时候,是不是定义一个数据成员,放在所有的构造函数里,自加加。那么定义的这个数据成员如果是普通的数据成员,就会变成对象所私有的,也就失去了它的意义。因为当其他对象生成的时候,又会初始化另外一个相同名字的数据成员变量。这里就是定义一个静态数据成员,这样这个静态数据成员就是为这个类服务的,当生成多个对象时候调用构造函数时,不会出现像普通数据成员一样又初始化一次的情况出现。那么就能统计出共生成了多少个对象。
示例二:我们如果要抽象出一个连锁店的类,每个连锁店都有商品,抽象出一个商品类。连锁店的商品的价格是统一的。如果有一天要上调该商品的价格。我们要对每个实例出来的连锁店对象都进行修改,显然是很辛苦的。如果使用静态数据成员的话就没有这么麻烦。只要在定义出更改即可。而且也会节省内存,因为如果是普通数据成员的话,每个对象都要去初始化一个变量。
这里体现出来静态成员的减少修改代码的麻烦和节省内存的用处。如何访问静态数据成员
<类对象名>.<静态数据成员名> <类类型名>: :<静态数据成员名>非静态成员就不可以使用 <类类型名>: :<静态数据成员名>
静态函数成员
这里静态函数成员也是为整个类服务的,所以使用上和静态数据成员是一样访问的。普通函数成员1)调用时候必须依赖一个对象2)能访问私有和保护的成员3)类作用域
静态函数成员1)不需要依赖对象,可以说明下作用域即可访问2)能访问静态函数成员和静态函数成员3)类作用域
普通函数成员是_thiscall调用约定,静态函数成员调用时候是_cdecl调用约定。这就是他们访问对象成员时候受到限制的原因。 也是因为它不是_thiscall调用约定,所以它不是为单个对象服务的,服务于整个类的。或许这么理解有些牵强,反过来理解更好。设计者本身当初设计出来静态函数成员目的就是要服务整个类,所以它才是_cdecl调用约定。静态数据成员和静态函数成员这点有区别静态函数成员可以在类中和类外都可以定义而数据是占用内存的,类只占一个字节内存(是为了解决使用到类时候有个地址方便寻址的),所以不能再类中定义。
-
详解Python中的静态方法与类成员方法
2020-09-21 10:08:00主要介绍了关于Python中静态方法与类成员的相关资料,文中通过示例代码给大家详细总结了两者在语法和使用上的区别,有需要的朋友可以参考借鉴,下面来一起看看吧。 -
C#中的静态成员、静态方法、静态类介绍
2021-01-21 18:14:54静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量和静态方法;静态方法不可以直接访问实例变量和实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法; ... -
静态方法为什么不能调用非静态成员(成员方法和成员变量)?
2020-09-10 10:23:02静态方法为什么不能调用非静态成员(成员方法和成员变量)? 静态方法在项目编译时就运行了,是属于类的。 当new对象时会调用构造器,实例化对象,非静态变量才存在 静态方法在编译的时候非静态变量还不存在,而动态... -
c++静态方法和静态成员
2019-05-23 20:43:33c++静态方法和静态成员 便于实现同一类的不同对象之间数据共享 静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,如:设置全局性的变量或对象是一种方法。但是,全局变量或对象是有局限性的。这一章里... -
成员方法和静态方法的区别
2020-08-12 20:31:01调用方式不同:成员方法 对象名点方法名(同一个类中可以省略对象),静态方法 类名点方法名 (同一个类中可以省略类名) 加载时期不同:静态方法是随着类的加载就会加载静态变量和静态方法,成员方法是随着创建对象... -
静态方法只能访问静态的成员变量和静态的成员方法
2019-02-20 16:17:35静态比对象先存在(所以找不到后来出现的对象,只能找到 同区域的静态值)。 -
普通成员变量与静态成员变量的区别、普通成员方法与静态成员方法的区别
2017-10-29 21:47:161. 类中静态成员变量与非静态成员变量的区别 (1).生命周期: 静态成员变量从类被加载开始到类被卸载,一直存在。 普通成员变量只有在类创建对象后才开始存在,对象结束,它的生命也就告终。 (2).共享方式: 静态... -
普通成员方法、静态成员方法、常成员方法的总结
2018-09-12 14:26:13可以调用静态成员方法 可以调用常成员方法 static成员方法 能访问部分私有的、保护的成员 eg:静态成员变量 类的作用域中 常成员方法 调用的时候必须依赖一个对象 可以访问私有的、保护的成员 类的作用域中 ... -
【Java】静态方法只能访问静态成员
2020-08-17 11:43:08静态方法只能访问静态成员是常见的java知识点,这个知识点是针对于静态方法在本类中只能直接访问静态成员,而不能访问直接访问非静态成员变量。 原因: 静态的内容是随着类的加载而加载,所以当类加载时,静态方法和... -
C++静态成员函数访问非静态成员的几种方法
2020-07-03 18:21:36文章目录C++静态成员函数访问非静态成员的几种方法方法一:方法二:方法三:方法四: 方法一: 有一个很取巧的办法,就是在静态函数的形参表里加上实例的地址,也就是 class A { public: static void test(A *a) {... -
C++类的静态成员初始化详细讲解
2020-09-05 00:10:09通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化 -
XLua脚本中调用C#脚本类中的私有成员以及静态和非静态成员方法
2019-12-29 17:31:351.xlua框架,访问C#脚本中类的私有成员变量...2访问静态成员方法 xlua.hotfix(CS.类名,‘修补的C#中的方法名’,function(self) - -lua文件中对C#里面的方法进行实现 self.静态成员方法 self:非静态成员方法 end ... -
java中的抽象类的的静态成员方法和静态成员变量可以通过类名直接调用
2018-10-26 11:20:59public class Test2 { public static void main(String[] args) { Test.show();//ddd } } public abstract class Test { ...可以这样理解:抽象类中除了可以在类中定义抽象方法外和普通类毫无区别. -
再探私有/公有静态成员变量与私有静态成员方法
2015-09-06 12:20:58问题1: 为什么在类内的静态成员定义后,要到类的外部在定义和初始化? 问题2:为什么类的静态成员在类外部的定义只能一次? 问题3:私有的静态成员变量如何初始化,访问权限还是私有么? 问题4:在程序执行过程中,... -
为什么静态方法无法调用非静态成员(方法和变量)
2018-06-28 10:58:29当New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后 再在堆内存中创建对象。所以说静态方法会随着类的加载而被... -
静态成员与非静态成员的区别
2019-08-24 10:08:54一、静态成员的特点: (1)static数据成员在类的内部声明,但只能在类的外部定义,在类的外部不能指定static,在类的定义时候进行初始化; (2)static数据成员只能在类的外部进行初始化(特例:当整型const static... -
C++类中的静态成员与静态方法
2018-09-11 20:55:35C++中,若类的方法前加了static关键字,则该方法称为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,也可以通过类来使用。但一般提倡通过类名来使用,因为静态方法只要定义了类,不必建立类的... -
C++中类的静态成员函数不能调用非静态成员变量
2019-10-02 16:05:59其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之中的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非... -
java中静态方法中调用非静态方法的详解
2021-03-05 22:58:12首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的;函数前后顺序是先加载,才能初始化,那么加载的时候初始... -
静态方法(类方法)与非静态方法(成员方法/实例方法)
2016-07-28 14:29:46但静态方法只能访问静态成员(包括方法和变量)。 (被调用区别)非静态方法必须由实例对象来调用,而静态方法除了可由实例对象调用外,还可以由类名直接调用。 (super,this)非静态方法中可以使用super、this... -
c#中的静态成员、静态方法、静态函数之说.docx
2020-09-12 11:15:44PAGE / NUMPAGES 一 C#静态成员|静态方法|静态构造函数 一静态成员(static) (1) 静态成员属于类所有非静态成员属于类的实例所有 (2) 每创建一个类的实例都会在内存中为非静态成员新分配一块存储非静态成员属于类所有... -
C++静态成员函数访问非静态成员的四种方法
2021-07-01 17:00:48大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 class... -
静态方法和非静态方法区别?
2019-08-24 23:42:26静态方法static(类方法)和 非静态方法(实例方法)的区别: 方法我们主要分为三种: 1.构造方法 2.非静态方法(普通方法/实例方法) 3.静态方法(类方法) 对于1(补充一下):构造方法分为无参构造方法 和 有参... -
C#--第九周实验--任务2--定义一个静态成员方法,该方法实现字符串反转。
2012-10-21 21:49:09/* (程序头部注释开始) * 程序的版权和版本声明部分 ... * 文件名称:定义一个静态成员方法,该方法实现字符串反转. * 作 者: 雷恒鑫 * 完成日期: 2012 年 10 月 21 日 * 版 本 号: V1.0 * -
java中静态类和静态变量和静态方法分别有什么特点?
2018-02-27 13:51:22一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。 三、静态变量 静态变量与静态方法类似。 所有此类实例共享此静态变量 ,也就是...
收藏数
539,605
精华内容
215,842