1.静态成员函数只属于类本身,随着类的加载而存在,不属于任何对象,是独立存在的
static成员函数属于类,独立于对象存在,不依赖于对象。静态的特点:随着类的加载而加载,优先于对象存在,被所有对象共享,可以直接被类名调用。
非static成员函数属于类,依赖于对象。当没有对象的时候,你怎么能够用static成员函数去访问非静态成员变量呢?
2.非静态成员当且仅当实例化对象之后才存在,静态成员函数产生在前,非静态成员函数产生在后,故不能访问
3.内部访问静态成员用self::,而访问非静态成员要用this指针,与普通的成员函数相比,静态成员函数由于不是与任何的对象相联系,因此静态成员函数它不具有this指针.从这个意义上来说,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其他的静态成员函数
但是普通成员函数可以调用静态函数。
static成员函数中没有this super这些指针,非static成员函数中拥有。
public class staticTest {
public void play(){
//方法体
}
public static void main(String[] args) {
//main()为静态方法,play()为非静态方法;
//静态方法是类本身的方法,用类.方法调用,而不是该类的实例
//play()方法是实例方法,需要通过实例去调用.
play();//错误的
staticTest st = new staticTest();//正确的
st.play();
}
}
静态方法
1、静态方法只能访问静态成员,包括成员变量和成员方法;不能直接访问非静态成员(包括成员变量和成员方法);
2、在静态方法中,没有this/super关键字
非静态方法
非静态方法可以访问静态成员,也可以访问非静态成员,而且必须创建该类对象才能调用非静态成员,因为静态优于对象存在,在静态方法加载进内存时,非静态的还未进入内存中。
静态虽好,不能乱用
利:将对象共享的数据进行单独存储,节省空间,可以通过 类名.成员名 调用
弊:生命周期过长,访问出现局限性,静态只能直接访问静态,而不能直接访问非静态(非静态属于对象,静态优于非静态之前创建)
from:https://blog.csdn.net/kunlcw/article/details/82971292
from:https://blog.csdn.net/weixin_42386014/article/details/81142171
静态成员的概念:
静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员先于类的声明而存在于内存,也可以根据类声明的对象来访问.而非静态成员必须实例化之后才会分配内存.
非静态成员的概念:
所有没有加static的成员都是非静态成员.而类被实例化后,可以通过实例化的类名进行访问.非静态成员的生存期决定于该类的生存期.而静态成员不存在生产期的问题,因为它始终驻留在内存.
静态全局变量
static int n;//定义静态全局变量 改为: int n;//定义全局变量
区别: 静态全局变量不能被其他文件所用.因而其他文件可以定义相同名字的变量,而不会发生冲突.
成员变量也叫实例变量;静态变量也叫类变量。
静态成员属于类,而非静态成员是属于对象
成员变量存储到堆内存的对象中,静态变量存储到方法区的静态区中。
生命周期不同:
1)成员变量随着对象的出现而出现,随着对象的消失而消失。
2)静态变量随着类的出现而出现,随着类的消失而消失。
1.静态变量使用 static 修饰符进行声明,在类被实例化时创建;被static修饰的成员变量或者方法优于对象的存在。(被static修饰的成员变量或者成员方法相比较非静态成员多了一种被调用的方法:可以通过 类名.成员名)
2.非静态变量.在对象被实例化时创建,通过对象进行访问;
3.一个类的所有实例的同一静态变量都是同一个值(被static修饰的成员变量或者成员方法能够被类的所有对象所共享),同一个类的不同实例的同一非静态变量可以是不同的值;
解释:对于非静态数据成员,每个类对象都有自己的拷贝.而静态数据成员被当做是类的成员,无论这个类被定义了多少个,静态数据成员都只有一份拷贝,为该类型的所有对象所共享(包括其派生类).所以,静态数据成员的值对每个对象都是一样的,它的值可以更新.因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以它不属于特定的类对象,在没有产生类对象前就可以使用.