A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小路飞 中级黑马   /  2013-3-10 11:16  /  1643 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于‘’多态中非静态函数、静态函数和非静态变量、静态变量在内存中的调用过程‘’还是有点晕,求实例详解,谢了

2 个回复

倒序浏览
本帖最后由 袁见 于 2013-3-10 12:44 编辑

静态函数和静态变量:静态函数和静态变量是属于类的本事,在同一个JVM内,每一个类只对应一个Class对象。
因此一个类的类变量只需要一块内存空间。当虚拟机第一次加载类时,会为该类的静态变量分配的空间,用于存类成员的数据。
而且只会执行一次。类成员不能访问实例成员,但实例成员可以访问类成员。所以可以通过类.类成员和对象.类成员。
非静态函数和非静态变量:他们属于对象,不属于类,所以在创建对象的时候,才会为他们分配内存空间,而且每创建一个对象,都会为其分配相应的空间。
回复 使用道具 举报
本帖最后由 朱荣宁. 于 2013-3-10 12:04 编辑

多态中非静态函数、静态函数和非静态变量、静态变量在内存中的调用过程‘


我来回答你的问题,希望对你有用
首先在类中,
用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。用static声明的方法是静态函数,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员
还有就是静态成员函数的声明除了在类体的函数声明前加上关键字static,以及不能声明为const或者volatile之外,
与非静态成员函数相同。出现在类体之外的函数定义不能制定关键字static。
静态成员函数没有this指针
静态函数不再是针对于某个对象调用,所以不能访问非静态成员,给你举例如下;
public class Cat {
private static int sid = 0;
private String name;
int id;
Cat(String name)
{
= name;
id = sid++;
}
public void info()
{
System.out.println
("My name is "+name+" No."+id);
}
public static void main(String arg[])
{
Cat.sid = 100;
Cat mimi = new Cat("mimi");
mimi.sid = 2000;
Cat pipi = new Cat("pipi");
}
}
如果某些成员函数只访问静态数据成员,那么最好把他们声明为静态的成员函数,
因为这样不需要特定的对象就可以访问这些
成员变量了。

非静态成员变量
这种成员只有在实例化一个类的时候编译器才会为他分配内存,具体分配在那个位置要看这个对象是在哪里定义的,
不一定是在栈上,如果用new会在堆上,如果是全局有可能在BSS段。
非静态函数
在类里声明的也非静态函数通过实例调用普通函数是依赖于类的实例的,没有类实例就不能调用。
而static函数没有this这个隐含参数。所以调用它时不用依赖类实例。也就是可以采用className::funName的方式调用。
当然它不依赖于类实例的指针,也就没办法用this->*方式调用类的其他成员。设置成静态函数大多是在需要回调函数的时候。
对于这一点,当然也可以使用全局函数。但是类静态函数对于全局函数来说有一个好处
就是可以使用类的private和protected成员(当他获得类实例指针的时候,比如参数传入)。

静态和非静态主要有以下差别
1.从存储的角度看,静态变量和方法在静态存储区分配内存,而非静态的在栈区或者堆上分配内存
2.从作用域来讲,静态变量在其作用域范围内存在于整个程序的运行过程中,而非静态变量的作用时间也是局部的。
3.从使用角度来讲,静态变量和方法没有this指针,只能通过类名引用。

如果你还不明白,最简单的是你可以这样理解,比如:静态成员是在所有对象中共享的成员;非静态成员不是共享的,每一个对象都有自己的非静态成员









回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马