Java中类方法与实例方法的区别
2016-05-11 20:03
501 查看
Java中类的方法分为类方法(用static修饰,也叫静态方法)和实例方法(没有用static修饰,也叫非静态方法),这两种方法之间有什么区别呢?
一. 实例方法
当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。从而实例方法可以被类创建的所有对象调用,还有一点需要注意,当我们创建第一个类的对象时,实例方法的入口地址会完成分配,当后续在创建对象时,不会再分配新的入口地址,也可以说,该类的所有对象共享实例方法的入口地址,当该类的所有对象被销毁,入口地址才会消失。
二. 类方法
当类的字节码文件加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失。
因为类方法的入口地址的分配要早于实例方法的入口地址分配时间,所有在定义类方法和实例方法是有以下规则需要遵循:
1. 在类方法中不能引用实例变量
实例变量的定义类似实例方法,没有用static修饰的变量,实例变量的创建与实例方法的创建相同,也是在类的对象创建时完成,所以在类方法中是不能引用实例变量的,因为这个时候实例变量还没有分配内存地址。
2. 在类方法中不能使用super和this关键字
这是因为super和this都指向的是父类和本类的对象,而在类方法中调用的时候,这些指代的对象有可能都还没有创建。
3. 类方法中不能调用实例方法
原因同1。
与类方法相比,实例方法的定义就没有什么限制了:
1. 实例方法可以引用类变量和实例变量
2. 实例方法可以使用super和this关键字
3. 实例方法中可以调用类方法
一. 实例方法
当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。从而实例方法可以被类创建的所有对象调用,还有一点需要注意,当我们创建第一个类的对象时,实例方法的入口地址会完成分配,当后续在创建对象时,不会再分配新的入口地址,也可以说,该类的所有对象共享实例方法的入口地址,当该类的所有对象被销毁,入口地址才会消失。
二. 类方法
当类的字节码文件加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失。
因为类方法的入口地址的分配要早于实例方法的入口地址分配时间,所有在定义类方法和实例方法是有以下规则需要遵循:
1. 在类方法中不能引用实例变量
实例变量的定义类似实例方法,没有用static修饰的变量,实例变量的创建与实例方法的创建相同,也是在类的对象创建时完成,所以在类方法中是不能引用实例变量的,因为这个时候实例变量还没有分配内存地址。
2. 在类方法中不能使用super和this关键字
这是因为super和this都指向的是父类和本类的对象,而在类方法中调用的时候,这些指代的对象有可能都还没有创建。
3. 类方法中不能调用实例方法
原因同1。
与类方法相比,实例方法的定义就没有什么限制了:
1. 实例方法可以引用类变量和实例变量
2. 实例方法可以使用super和this关键字
3. 实例方法中可以调用类方法
相关文章推荐
- Spring中到底什么是控制反转
- Java并发编程:阻塞队列
- 浅谈Struts2
- Myeclipse开发web程序
- ubuntu下配置java环境
- SpringMVC java 配置 DispatcherServlet
- 【java】KDTree,实现个java版本,留着日后可能用得上
- java RTTI和反射
- 自学Java步骤
- Java并发编程:线程池的使用
- JVM调优Demo(一)避免新生代过小(增大新生代大小)
- Intellij Idea技巧-1
- eclipse或者myeclipse安装ext插件
- Intellij IDEA搭建maven+注解SpringMVC框架
- 深入理解Java中的Map
- java中创建类与对象
- Java 7之基础 - 强引用、弱引用、软引用、虚引用(总结的很好)
- eclipse开发工具报错gc overhead limit exceeded的解决方案
- ElasticSearch之Java Api聚合分组实战
- java执行过程(自己的理解,希望大神指点)