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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Java中可以直接调用类中静态方法,不用实例化么,详解!原理

14 个回复

倒序浏览
因为加了static关键字的变量或者方法是属于类的,在程序加载类的字节码的时候就加载到一个静态内存区域里面去了,而且一直在程序运行中存在,不会随着方法的调用结束而消失。所以是直接通过类名调用的  它属于类 不属于实例对象
回复 使用道具 举报
当声明一个方法是static的时候,就意味着这个方法不会和包含它的那个类的任何对象实例关联在一起。
所以,即使你从未创建这个类的任何对象,也可以调用起static方法。
回复 使用道具 举报
被static修饰的方法,是存储在内存中,方法区中的静态区的!它使随着类的加载而进入内存的!所以即使没哟建立该类的对象,静态的方法也已经存在于内存中了!所以可以用类名来调用该方法!
回复 使用道具 举报
       如果一个类中有静态变量的话,程序首先会把该静态变量加载进内存中,也就是在堆中开辟一个区域专门存放。以后不管你new多少个类的对象,该静态变量永远都是在那里的。也就是说,静态变量在类的初始化一次后,系统就不会为该变量开辟新的内存空间。而每new一个类的对象,系统就会重新在堆内存中开辟一个新空间来存放该类的实例对象,并且栈中也会有一个新的引用变量去指向它。
      静态方法也是类似,但是有一点要强调,静态方法只中不能调用非静态方法。因为被static修饰的方法会首先被Classloader对象先加载进内存,而这个时候可能其它的非静态方法或者变量还没有被加载进来。被static修饰过的都是随着类的初始化后就产生了,在堆内存中都有一块专门的区域来存放,所以只需要类名点方法名或者变量名即可。
回复 使用道具 举报
刚看到这课,说下我的理解:
静态变量也叫类变量,随类的创建而创建,并且存在于方法区,随类的消失而消失,非静态变量也叫实例变量,是随对象的创建而创建,存在于堆内存,对象消失,实例变量就消失.
静态变量的特点:被所有对象共享,并且能够被类直接调用.
因为静态能够被类直接调用,所以当没得实例变量要访问的时候,就把方法全部定义成静态,直接用类来调用,那就不需要创建对象了,不需要实例化.但是如果有要访问的实例变量,那肯定要创建对象,不然不能访问这些实例变量,因为静态方法只能访问静态成员

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
一般在方法前加了static关键字后,就说明这个方法是类方法,在变量前加static 说明它是类变量,而非实例变量,因此我们在访问的时候可以
类名.方法名  或是 类名.变量名
回复 使用道具 举报
静态的方法,是随着类的加载而加载入方法区的,随着类的存在而存在,消亡而消亡,它在内存中只有一个备份,使用类来调用,可以节省内存空间;也可以实例化对象来调用静态方法,但是如果你实例化对象,就会在堆内存中开辟空间,所有的对象都指向这一个备份,当时用完该方法时,对象没能及时的被垃圾回收机制回收,暂用内存空间,所以我们不会实例化对象来调用静态方法,优先考虑用类来调用。
回复 使用道具 举报
简单地说,用static修饰的方法和变量,他是随着类加载到内存而在创建的。也就是说,类加载到内存了,被static修饰成员或者方法也就创建了。所以你可以直接用类名去调用他们。
回复 使用道具 举报
被static修饰的方法,是存储在内存中,方法区中的静态区的!它使随着类的加载而进入内存的!所以即使没哟建立该类的对象,静态的方法也已经存在于内存中了!所以可以用类名来调用该方法

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 你很积极!赞一个!

查看全部评分

回复 使用道具 举报
宋洪祥 发表于 2012-3-12 19:19
如果一个类中有静态变量的话,程序首先会把该静态变量加载进内存中,也就是在堆中开辟一个区域专门 ...

静态的方法和变量,在堆内存中吗?我记得堆内存中装的是new出来的“东西”,栈内存中装的是使用到什么就加载什么,即压栈,使用完了就释放了,即弹栈。在方法区中装的是方法,开辟了专门的区域存储随着类的加载而加载入内存的静态成员。(如果还有没提到的,希望懂的更多的朋友,指点,谢谢)
回复 使用道具 举报
王杰 黑马帝 2012-3-13 17:45:20
12#
四海为家 发表于 2012-3-13 16:37
静态的方法和变量,在堆内存中吗?我记得堆内存中装的是new出来的“东西”,栈内存中装的是使用到什么就 ...

你说的对!
方法区分为静态区和非静态区。
静态区存放静态方法和属性;
非静态区存放非静态的方法和属性;
回复 使用道具 举报
王杰 发表于 2012-3-13 17:45
你说的对!
方法区分为静态区和非静态区。
静态区存放静态方法和属性;

谢谢你得指点,我更懂了,让方法区里的结构
回复 使用道具 举报
在类加载的时候会创建一个类对象到内存;  因为静态方法是static修饰的;  是在类加载的时候作为属性附到类对象上的; 所以没有创建类的实例 所以在没有实例化的时候它已经存在内存,且可用通过类调用; 被共享;
回复 使用道具 举报
袁野 黑马帝 2012-3-13 22:18:17
15#
静态属于类的 所以可以通过类.成员
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马