本文目录一览:
什么是类的静态成员?它有什么特点
静态成员,指的是在c++类中声明成员时可以加上static关键字,这样声明的成员就叫做静态成员(包括数据成员和成员函数)。即声明为static的类成员或者成员函数便能在类的范围内同享。
静态数据成员属于整个类,即使没有任何对象创建,类的静态数据成员变量也存在。
因为类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显式地初始化,一般要在类外进行。
外部访问类的静态成员能直接通过类名来访问,例如:test::getCount()。虽然静态成员不属于类的某个对象,但是我们仍然可以使用类的对象、引用或指针来访问静态成员。
类的静态成员函数无法直接访问普通数据成员(可以通过对象名间接的访问)。
静态成员和类的普通成员一样,也具有public、protected、private3种访问级别,也可以具有返回值、const修饰符等参数。
静态成员和非静态成员的区别
一、名称上的区别:
成员变量也叫实例变量;静态变量也叫类变量。
二、内存存储的区别:
成员变量存储到堆内存的对象中,静态变量存储到方法区的静态区中。
三、生命周期不同:
1)成员变量随着对象的出现而出现,随着对象的消失而消失。
2)静态变量随着类的出现而出现,随着类的消失而消失。
四、补充:
1.静态变量使用 static 修饰符进行声明;
2.在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量;
3.在对象被实例化时创建,通过对象进行访问;
4.一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值;
5.静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
6.示例:
1)using System;
using System.Collections.Generic;
using System.Text;
namespace Example01
{
class Program
{
class Class1
{
public static String staticStr = “Class”;
public String notstaticStr = “Obj”;
}
static void Main(string[] args)
{
2)//静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
Console.WriteLine(“Class1′s staticStr: {0}”, Class1.staticStr);
Class1 tmpObj1 = new Class1();
tmpObj1.notstaticStr = “tmpObj1″;
Class1 tmpObj2 = new Class1();
tmpObj2.notstaticStr = “tmpObj2″;
3)//非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
Console.WriteLine(“tmpObj1′s notstaticStr: {0}”, tmpObj1.notstaticStr);
Console.WriteLine(“tmpObj2′s notstaticStr: {0}”, tmpObj2.notstaticStr);
Console.ReadLine();
}
}
}
4)结果:
Class1′s staticStr: Class;
tmpObj1′s notstaticStr: tmpObj1;
tmpObj2′s notstaticStr: tmpObj2。
静态成员和非静态成员的区别?
静态成员----有static关键字修饰的成员变量或者方法
非静态成员---没有static关键字修饰的成员变量或者方法
在java里面,因为变量都是要存储在内存中,并且程序的运行也是在内存中,而静态成员的主调是该成员所属的类,当静态成员定义时类已经存在,所以相应的静态成员也就在内存中存在,并且分配给了内存空间,但是非静态成员的主调是属于类中的实例,只有当实例存在时才能为非静态成员分配存储空间,当静态成员存在的时候非静态成员可能还不存在,所以-----java里面静态成员不允许直接访问非静态成员,比如:
(以下代码来自参考书籍,只是为自己提供参考,不涉及任何违法内容)
//静态成员不能直接访问非静态成员
public class StaticAccessNoStatic
{
//创建一个非静态方法
public void info(){//非静态方法
//非静态方法的执行体
System.out.println("我们都是笨小孩,却不忘挺起胸膛");
}
public static void main(String[] args) //静态方法
{
//在java语言里面因为内存机制的问题,所以静态成员不能直接访问非静态成员,main()方法是静态方法
//而info()是非静态方法,所以不能直接访问,以下的语句是错误的
info();
由上面的代码运行结果可知:
静态成员访问非静态成员会出现编译的错误
可以利用对象来进行访问,代码如下
//静态成员要想访问非静态成员,可以借助于对象来进行调用访问
new
StaticAccessNoStatic().info();//利用new关键字调用构造器创建一个实例,利用实例直接调用非静态方法
//以下的方法与上面的句子是等价的
StaticAccessNoStatic s=new
StaticAccessNoStatic();
s.info();
}
}
即利用new关键字来调用构造器,定义一个对象,利用对象来访问非静态方法,从而实现非静态方法调用静态方法的目的
注意:非静态成员是可以直接调用静态成员的,注意java的一些特殊用法可以更好的实现java的学习。
什么叫静态函数成员,它有何特点
静态成员:不管这个类创建了多少个对象,静态成员在内存中只保留一份,静态成员用来解决同一个类中不同对象之间数据成员和函数的共享问题。
1、静态成员函数是用关键词static声明的成员函数,它属于整个类而并不属于类的某个对象。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
由于静态函数是独立于类对象而存在的,因此静态成员函数中没有this指针。所以静态成员函数不可以直接访问类中的非静态成员,但是可以直接访问静态成员。
若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。