为什么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 的时间也不多,但这个问题也帮助我更 ...
随机推荐
- RobotFramework教程使用笔记——Selenium2Library库
selenium之前已经学习介绍过了,它是一个支持多语言.多平台.多浏览器的web自动化测试框架,在robotframework中也可以导入selenium库来进行web自动化测试.它使用seleni ...
- BZOJ 1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典:dp【删字符最少】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1633 题意: 给你一个长度为n的主串a,和一个有m个字符串s[i]的单词书(s[i].si ...
- codeforces A. Fox and Box Accumulation 解题报告
题目链接:http://codeforces.com/problemset/problem/388/A 题目意思:有 n 个 boxes,每个box 有相同的 size 和 weight,但是stre ...
- Sublime Text 相关教程(转)
曾经有人说过,世界上有两种编辑器,好用和不好用的:而在好用的编辑器中,又分两种,免费的和死贵死贵的.譬如说VIM 和 TextMate,就是免费和死贵的典型.很不幸,今天的主角 Sublime Tex ...
- hdu-5003 Osu!(水题)
题目链接: Osu! time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Prob ...
- SQL Server 2008将数据导出为脚本 [SQL Server]
之前我们要将一个表中的数据导出为脚本,那么只有在网上找一个导出数据的Script,然后运行就可以导出数据脚本了.现在在SQL Server 2008的Management Studio中增加了一个新特 ...
- HUD1686(KMP入门题)
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- saltstack master minion安装配置简单使用
首先先了解下saltstack是什么,为什么使用它 它与Ansible.Puppet都属于集中管理工具,由于现在企业规模的不断庞大及业务的增长,所需要管理的服务器数量增多,而且大部分机器都属于同类业务 ...
- 一种C#开发ActiveX的思路
由于某些原因,不得不在C#下开发ActiveX插件,而这会带来很多问题,主要有无法在线安装.无法自动更新.由于本人水平有些,这两个问题不一定是这样,如果有大侠知道C#下开发ActiveX插件可实现在线 ...
- Linux 无法登陆172.***.***.***的子网
1. sudo dhclient -r 这条命令重复执行几次 2. dhclient - 3.查看ifconfig