Java是面向对象的语言,所有的变量,方法都是针对对象而言的。一般来说,要调用一个方法,你需要new 这个方法的对象。

什么时候用static?

如果你想要:

  1. 对于一个类的所有对象共享一个变量或者是方法,即有一块特定区域的内存,不管多少个对象被new出来,或者是没有对象被new出来,那块内存区域都存在。
  2. 如果有个方法,你想在调用它的时候,可以不用通过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方法的更多相关文章

  1. eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?

    eclipse 中main()函数中的String[] args如何使用? 右击你的项目,选择run as中选择 run configuration,选择arguments总的program argu ...

  2. Java-main方法中调用非static方法

    java的calss中,在public static void main(String[] args) { }方法中调用非static的方法:在main方法中创建该calss的对象,用对象调用非sta ...

  3. static 关键字详解 static方法调用非static属性和方法

    静态的属性和方法在内存中的存放地址与非静态的是不同的,静态的是存放在static区,它意味着静态方法是没有this的,所以我们不可以从一个static方法内部发出对非static方法的调用.但是反之是 ...

  4. 是否可以从一个static方法内部调用非static方法?

    不可以.静态成员不能调用非静态成员. 非static方法属于对象,必须创建一个对象后,才可以在通过该对象来调用static方法.而static方法调用时不需要创建对象,通过类就可以调用该方法.也就是说 ...

  5. Struts2 调用非execute方法

    调用非execute方法 1)如果你的Action类是继承自ActionSupport的话,确切的说是重写了execute方法,ActionSupport里的默认实现就是返回"success ...

  6. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  7. java基础:方法的定义和调用详细介绍,方法同时获取数组最大值和最小值,比较两个数组,数组交换最大最小值,附练习案列

    1. 方法概述 1.1 方法的概念 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可 ...

  8. CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写

    Q: CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写 A: 建议统一写,CI框架会自动识别已经加载过的类,所以不用担心重复加载的问题 class C_User ...

  9. Java:main方法前面一定要加static?在main方法中一定要调用static方法?

    今天敲代码的时候发现,出现了这样一个情况: 我在我在main方法中调用了一个函数,并且这个函数没有用static修饰,就像这样: 这样报错了!!! 我虽然学Java 的时间也不多,但这个问题也帮助我更 ...

随机推荐

  1. NYOJ-37 回文字符串 —— LCS变形

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=37 题解: 一开始想从两边向中间添加字符,发现这样不是最优的.因为加入字符之后,这些原本存 ...

  2. Java 8新特性之旅:使用Stream API处理集合

    在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...

  3. 【转】看C++文档的小知识

    转载:http://www.ggv.com.cn/forum/clib/ctype/isspace.html 函数isspace 原型:extern int isspace(int c);    用法 ...

  4. Sports

    题目链接 : http://acm.hpu.edu.cn/problem.php?id=1184 或者       http://acm.nyist.net/JudgeOnline/problem.p ...

  5. codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)

    题目链接: B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input ...

  6. ceph学习之pool

    pool是ceph存储数据时的逻辑分区,它起到namespace的作用.其他分布式存储系统,比如Mogilefs.Couchbase.Swift都有pool的概念,只是叫法不同.每个pool包含一定数 ...

  7. 五、hibernate在myeclipse中生成实体和映射

  8. ETL 循环导入 平面文件

    http://blog.csdn.net/zlp321002/article/details/3413365 ETL设计之-Foreach 循环容器 应用场景: 批量导入某一文件夹下的所有文件.就可以 ...

  9. .Net框架中的CLR,CTS,ClS的解释

    CLR的全称(Common Language Runtime) 公共语言运行时 可以把它理解为包含运行.Net程序的引擎 和 一堆符合公用语言基础(CLI)的类库的集合,他是一个规范的实现,我们开发的 ...

  10. Game of Peace

    Time Limit: 4000ms, Special Time Limit:10000ms, Memory Limit:65536KB Total submit users: 20, Accepte ...