为什么static方法中不可以调用非static方法
Java是面向对象的语言,所有的变量,方法都是针对对象而言的。一般来说,要调用一个方法,你需要new 这个方法的对象。
什么时候用static?
如果你想要:
- 对于一个类的所有对象共享一个变量或者是方法,即有一块特定区域的内存,不管多少个对象被new出来,或者是没有对象被new出来,那块内存区域都存在。
- 如果有个方法,你想在调用它的时候,可以不用通过new它的对象,或者说在这个类没有对象的情况下还是可以调用这个方法。
那么你就可以考虑使用static关键字了
为什么在static方法中不能调用非static的方法?
首先要讲一个关键字:this:
如果你有两个同一个类的对象,a和b
Banana a = new Banana(), b = new Banana();
假设这个Banana类中只有一个方法 void peel(int i),而且对象a和b都要调用这个方法,假如你是编译器你要怎么知道是谁调用了这个peel(int i)呢??
其实编译器偷偷做了点东西:在调用这个peel方法的时候,偷偷多传了个参数给peel,就是当前对象的引用。所以,这个两个方法的调用可以看作是这样的一个形式:
Banana.peel(a, 1);
Banana.peel(b, 2);
当然这是一个内部的表现形式,我们不能这样来写代码。只是帮助你理解的。
好的,现在假设你在一个方法中,你想获得这个方法所在对象的引用,我们知道编译器把这个引用偷偷地传了进来,但因为是偷偷地传进来,所以我们并不知道它是什么标识符,那怎么办呢?于是就有了关键字——this。 this关键字,是只可以用于非static方法中的,指向方法所在对象的一个引用。
所以,当你在一个类中的方法调用该类中的另一个方法的时候,可以看作是这样的:
public class Student {
void rest() {.....}
void study() {
do some study....
rest();
...
}
}
在上面的Student类中的study方法中调用了同一个类中的rest方法,我们其实可以看作:
void study(this) {
this.rest();
}
但这个this是看不见的,是编译器偷偷传过来的。
好的,现在就可以解释为什么在static的方法中不能调用非static的方法了:
因为static方法是没有this的,也就是编译器不会像对普通的方法一样偷偷传个对象的引用this给它。
这应该很好理解,因为static的方法不是针对某个对象的,不管这个类有没有对象,或者有多少个对象,这个static方法都会在内存中存在,显然是没办法传 所谓的方法所属对象的引用给它。 也就是说static方法中,没有this,那就没办法this.rest(),也就是没办法调用普通的非static的方法,因为这些方法都是要通过对象或者说是对象的引用才能调用的,static的方法中没有。
当然,你可以通过在static方法中new对象通过引用来调用方法或者说是通过传对象的引用作为参数来调用非static的方法。
为什么static方法中不可以调用非static方法的更多相关文章
- eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?
eclipse 中main()函数中的String[] args如何使用? 右击你的项目,选择run as中选择 run configuration,选择arguments总的program argu ...
- Java-main方法中调用非static方法
java的calss中,在public static void main(String[] args) { }方法中调用非static的方法:在main方法中创建该calss的对象,用对象调用非sta ...
- static 关键字详解 static方法调用非static属性和方法
静态的属性和方法在内存中的存放地址与非静态的是不同的,静态的是存放在static区,它意味着静态方法是没有this的,所以我们不可以从一个static方法内部发出对非static方法的调用.但是反之是 ...
- 是否可以从一个static方法内部调用非static方法?
不可以.静态成员不能调用非静态成员. 非static方法属于对象,必须创建一个对象后,才可以在通过该对象来调用static方法.而static方法调用时不需要创建对象,通过类就可以调用该方法.也就是说 ...
- Struts2 调用非execute方法
调用非execute方法 1)如果你的Action类是继承自ActionSupport的话,确切的说是重写了execute方法,ActionSupport里的默认实现就是返回"success ...
- 第7.22节 Python中使用super调用父类的方法
第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...
- java基础:方法的定义和调用详细介绍,方法同时获取数组最大值和最小值,比较两个数组,数组交换最大最小值,附练习案列
1. 方法概述 1.1 方法的概念 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可 ...
- CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写
Q: CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写 A: 建议统一写,CI框架会自动识别已经加载过的类,所以不用担心重复加载的问题 class C_User ...
- Java:main方法前面一定要加static?在main方法中一定要调用static方法?
今天敲代码的时候发现,出现了这样一个情况: 我在我在main方法中调用了一个函数,并且这个函数没有用static修饰,就像这样: 这样报错了!!! 我虽然学Java 的时间也不多,但这个问题也帮助我更 ...
随机推荐
- ffmpeg入门基础知识
获取ffmpeg源代码 如果你是在Windows环境下,则可以先装SVN的一个客户端TortoiseSVN(非常好用,强烈推荐),他安装完成后会集成在右键菜单中,点Checkout菜单,在弹出的界面中 ...
- ubuntu下安装cpython 0.2x
Quick installation of cython: Step 1: Update system: sudo apt-get update Step 2: Install: cython Ate ...
- GitHub的使用方法
版本控制系统 > Git 分布式 > Subversion 集中式 1. 安装git: # apt-get install git //root权限 $ sudo apt-get inst ...
- bzoj2957楼房重建——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护原点到楼顶的斜率,可以知道答案就是从原点开始斜率递增的个数: 记录一个mx数 ...
- JAVA 需要理解的重点 一
需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程中使用较多) 设计模式(熟悉常见设计模式的应用场景,会画类 ...
- C# HTML解析工具HtmlAgilityPack使用实例(一)
一.生成HTML字符串 //生成DOM字符串结构 HtmlNode container = HtmlNode.CreateNode("<div />"); HtmlNo ...
- 4.js屏蔽浏览器鼠标右键菜单
document.oncontextmenu = function(){return false;} 参考链接:js 屏蔽浏览器事件汇总
- C# ActiveX 中static变量缓存的问题
最近在忙活一个绘图程序,按照要求需要以ActiveX的方式发布在网站中,这个绘图程序的大概功能就是从数据库获取数据,成图.发布后用户反映,数据变化后,图形没有发生变化,好像有缓存,如果把浏览器全部关闭 ...
- Levko and Array
题意: 有一长度为n的正整数序列,你可以选择K个数字任意改变它,使得$max \{ a(i+1) - a(i) \} $ 最小,求最小值. 解法: 1.$O(n^2log(MAX_A) )$,考虑二分 ...
- codevs-2235
2235 机票打折 题目描述 Description .输入机票原价(3到4位的正整数,单位:元),再输入机票打折率(小数点后最多一位数字).编程计算打折后机票的实际价格(单位:元.计算结果要将个位数 ...