java学习总结(16.06.07)类的静态成员和非静态成员
2016-06-07 07:08
316 查看
java里,类的成员可分为静态成员和非静态成员(实例成员),静态成员和非静态成员,从定义上来说就是有没有static修饰符修饰的区别。有static修饰的成员就是静态成员。如
变量一直存在;
不能被其他文件访问的全局变量和函数;
属于类且不属于对象的全局变量和函数。
在一大部分人心中可能只把它理解为“静态”的意思,实际上Java仅仅取了C++中static的最后一个含义:即,不与类的实例相关联,仅与类相关联。
(斜体部分源自知乎:https://www.zhihu.com/question/20834765/answer/16364708)
②使用方法: 类名.静态成员名,也可以对象名.静态成员名.静态成员名,但不建议这么做因为不规范,IDE会报警告
③生存期:当类的字节码被加载到内存时,静态方法和静态变量就会被分配内存,直到程序结束时,静态成员的所占内存才会被释放。
④静态成员在该类的每一个对象中都是相同的
⑤静态方法不可以直接调用非静态方法和非静态变量
①非静态成员也叫实例成员,它是属于某个对象的,而非类。
②使用方法:对象名.非静态成员名
③生存期:当新建一个对象时,该对象的实例变量就会被分配内存(实例方法在类的字节码被加载到内存是已经被分配了内存,只是不创建一个对象就无法调用),而当程序运行到对象的作用域外时,对象所占内存会被释放,而此时实例成员所占内存就会被释放掉
④非静态方法可以直接调用静态成员和非静态成员
对于非静态方法,它除了参数列表里的显式参数外还有一个隐式参数this(代表调用方法的对象),而静态方法并没有this参数,因此静态方法无法得知应该对哪一个对象的非静态成员进行操作。就好比你叫一个人吃馒头,又不告诉他吃谁的馒头,他就不知道要吃谁的馒头了
也有一种说法是,静态成员的作用域比非静态成员的作用域广,静态方法存在时,也许并没有对象的实例成员,因此无法对非静态成员进行操作。就好比你饿了想吃馒头,然而根本就没有馒头,所以你就吃不了馒头了
①当类的所有对象需要共享某个数据成员时,可将该数据设为静态数据成员,如Student类的studentnumber。
②当某个方法具体实现与对象无关时,可将其设为静态方法。
③如果某个方法是用频率较高,或者方法本身通用性较强,无需初始化类成员变量,则可以使用静态方法,那样方便,速度也快.
最后附上我在某博客看到的一句话,“通过滥用静态方法以达到在面向对象的语言中继续进行面向过程的编程,这是很可怕的”
public static void fun1();//静态方法fun1 public void fun2();//非静态方法fun2 public static int a//静态变量a public int b;//非静态变量b
关于static修饰符的意义:
java中的“static”和C++中的“static”含义并不完全一样!!!C++中的关键字static被复写了三次,有三种含义,分别为:变量一直存在;
不能被其他文件访问的全局变量和函数;
属于类且不属于对象的全局变量和函数。
在一大部分人心中可能只把它理解为“静态”的意思,实际上Java仅仅取了C++中static的最后一个含义:即,不与类的实例相关联,仅与类相关联。
(斜体部分源自知乎:https://www.zhihu.com/question/20834765/answer/16364708)
静态成员:
①有static修饰符修饰,属于一个类而不是某个对象。②使用方法: 类名.静态成员名,也可以对象名.静态成员名.静态成员名,但不建议这么做因为不规范,IDE会报警告
③生存期:当类的字节码被加载到内存时,静态方法和静态变量就会被分配内存,直到程序结束时,静态成员的所占内存才会被释放。
④静态成员在该类的每一个对象中都是相同的
⑤静态方法不可以直接调用非静态方法和非静态变量
public class TestForStatic { private static int a=1; private int b=2; public static void staticFun(){ a++;//Cannot make a static reference to the non-static field b nonStaticFun();//Cannot make a static reference to the non-static method nonStaticFun() from the type TestForStatic public void nonStaticFun(){ a++; b++; }}
非静态成员:
①非静态成员也叫实例成员,它是属于某个对象的,而非类。②使用方法:对象名.非静态成员名
③生存期:当新建一个对象时,该对象的实例变量就会被分配内存(实例方法在类的字节码被加载到内存是已经被分配了内存,只是不创建一个对象就无法调用),而当程序运行到对象的作用域外时,对象所占内存会被释放,而此时实例成员所占内存就会被释放掉
④非静态方法可以直接调用静态成员和非静态成员
对于静态方法不能直接调用非静态方法和非静态变量的理解:
对于非静态方法,它除了参数列表里的显式参数外还有一个隐式参数this(代表调用方法的对象),而静态方法并没有this参数,因此静态方法无法得知应该对哪一个对象的非静态成员进行操作。就好比你叫一个人吃馒头,又不告诉他吃谁的馒头,他就不知道要吃谁的馒头了也有一种说法是,静态成员的作用域比非静态成员的作用域广,静态方法存在时,也许并没有对象的实例成员,因此无法对非静态成员进行操作。就好比你饿了想吃馒头,然而根本就没有馒头,所以你就吃不了馒头了
什么时候使用静态成员比较好?(在网上到处找了一下)
①当类的所有对象需要共享某个数据成员时,可将该数据设为静态数据成员,如Student类的studentnumber。②当某个方法具体实现与对象无关时,可将其设为静态方法。
③如果某个方法是用频率较高,或者方法本身通用性较强,无需初始化类成员变量,则可以使用静态方法,那样方便,速度也快.
最后附上我在某博客看到的一句话,“通过滥用静态方法以达到在面向对象的语言中继续进行面向过程的编程,这是很可怕的”
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树