Java静态方法为什么不能访问非静态方法
转载自:https://www.2cto.com/kf/201502/375549.html
非静态方法(不带static)可以访问静态方法(带static),但是反过来就不行,为什么呢?
public class test{
public void static main(String args[]){
method(); //会出错,提示你讲method方法改成静态的
method2(); //调用方法正确
new Test2().method(); //正确
}
public void method(){
System.out.println("HelloWorld");
}
public static void method2(){
System.out.println("HelloWorld");
}
}
public class Test2{
public void method(){
System.out.println("HelloWorld");
}
}
这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆内存中创建对象。所以说静态方法会随着类的加载而被加载。当你new一个对象时,该对象存在于对内存中,this关键字一般指该对象,但是如果没有new对象,而是通过类名调用该类的静态方法也可以。
程序最终都是在内存中执行,变量只有在内存中占有一席之地时才会被访问,类的静态成员(变态和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有在类的对象禅师(创建实例)的时候才会分配内存,然后通过类的对象去访问。
在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。
那类是什么时候被加载呢?在需要调用的时候被加载。
当出现错误:No enclosing instance of type is accessible. Must qualify the allocation with an enclosing instance of type (e.g. x.new A() where x is an instance of).时
很有可能就是这个原因
Java静态方法为什么不能访问非静态方法的更多相关文章
- [转]Java静态方法为什么不能访问非静态方法
非静态方法(不带static)可以访问静态方法(带static),但是反过来就不行,为什么呢? ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 publi ...
- JAVA Main方法中调用非静态方法
在JAVA中静态方法中只能调用其他,静态方法.main方法都是静态方法,如果想调用其它的方法,要么只能是其它的静态方法.还有一种方法就是将当前类实例化在调用它的非静态方法 public class t ...
- Java中的静态变量、静态方法问题
由关键字static所定义的变量与方法,分别称为静态变量和静态方法,它们又都被称为静态成员 1.静态方法 无需本类的对象也可以调用此方法,调用形式为“类名.方法名”,静态方法常常为其他类提供一些方法而 ...
- <转>java中静态方法和非静态方法的存储
Java中非静态方法是否共用同一块内存? 将某 class 产生出一个 instance 之后,此 class 所有的 instance field 都会新增一份,那么所有的 instance met ...
- 【转】java中静态方法和非静态方法的存储
将某 class 产生出一个 instance 之后,此 class 所有的 instance field 都会新增一份,那么所有的 instance method 是否也会新增一份?答案是不会,我们 ...
- Java中堆、栈,静态方法和非静态方法的速度问题
一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储 ...
- java中静态方法中为什么不能使用this、super和直接调用非静态方法
这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆 ...
- Java静态方法块、非静态方法块、构造方法、静态方法执行顺序
示范类StaticTest.java public class StaticTest { {//只有当创建对象的时候执行 System.out.println("H1 ...
- java中静态方法和非静态方法调用的一点小困扰,已解决。
public static void main(String[] args) { // TODO Auto-generated method stub SimpleGui1B gui=new Simp ...
随机推荐
- AJAX实现登陆
先添加点击事件 <input type="button" id="submitt" value="立即登录" /> 展示信息 & ...
- leetcode中的python学习
list.extend() list1.extend(list2(or string)) 将list2(or string)的所有元素添加到list1中: list1.append(list2(or ...
- Java BitSet解决海量数据去重
先提一个问题,怎么在40亿个整数中找到那个唯一重复的数字? 第一想法就是Set的不可重复性,依次把每个数字放入HashSet中,当放不去进去的时候说明这就是重复的数字,输出这个数字. if(hs.co ...
- GDI与GDI+性能比较
编写程序对GDI和GDI+绘制进行了比较,经过比较,GDI相对GDI+还是有一些性能优势的. 同时比较了每次绘制创建TGPGraphics对象和共用一个TGPGraphics对象的情况,两者性能相差不 ...
- 阅读ug949-vivado-design-methodology笔记
阅读ug949-vivado-design-methodology笔记 xilinx更加推荐使用同步复位 怎样去设计时钟使能信号
- servlet下载文件
package myjava.cn; import java.io.FileInputStream; import java.io.IOException; import java.io.InputS ...
- ObjectARX2012+ObjectARX Wizards2012+AutoCAD2012+MVS2008 环境配置
1 版本选择 ObjectARX本身采用的MVS编译平台,因此选择ObjectARX的编译平台作为二次开发的平台,兼容性最好,当然别的平台也不是一定不可以.目前已知的对应关系如下: R15 -- ...
- stm32 uart 中断 蜜汁bug
在项目中,使用stm32f103,配置uart1接收RXNE中断,使用DMA来进行UART1的发送. 初始化代码如下: void uart_init(u32 bound) { GPIO_InitTyp ...
- C7.cpp
Arr[i]==*(ar+i) &arr[i]==ar+i 编译过程的最终产品是可执行程序------由一组机器语言指令组成 内联函数的优点是速度快,但是会占用很多内存,若是在 ...
- ubuntu16安装dhcp server
目录 操作命令 apt-get install -y isc-dhcp-server vi /etc/default/isc-dhcp-server 我的修改内容为INTERFACES="e ...