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. MySQL学习笔记(四)——分组数据group by子句和having子句

    分组允许把数据分为多个逻辑组,以便对每个组进行聚集计算. 例如我们查下每个系里有多少名学生: 在使用group by 子句之前,还需要知道一些规定: 1. group by 子句可以包含任意数目的列, ...

  2. js中const,var,let区别 今天第一次遇到const定义

    今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 ...

  3. the art of seo(chapter four)

    SEO Implementation:First Stages ***Development Platform and Information Architecture***1.Technology ...

  4. git 错误 Reinitialized existing Git repository in /**/***/ 和refusing to merge unrelated histories

    报错一: 这句话的意思是 在路径 /Users/jackma/Downloads/lotteryTicket 2/.git/ 现有的Git存储库初始化 ➜ lotteryTicket 2 git:(m ...

  5. [LeetCode] Longest Valid Parentheses -- 挂动态规划羊头卖stack的狗肉

    (Version 1.3) 这题在LeetCode上的标签比较有欺骗性,虽然标签写着有DP,但是实际上根本不需要使用动态规划,相反的,使用动态规划反而会在LeetCode OJ上面超时.这题正确的做法 ...

  6. opencv3.4.0 安装过程中出现的问题

    重新安装opencv3.4.0 参考安装博客: opencv 安装版本测试:pkg-config --modversion opencv https://blog.csdn.net/cocoaqin/ ...

  7. 洛谷 1541 乌龟棋——dp

    题目:https://www.luogu.org/problemnew/show/P1541 以用了几张牌为阶段.注意知道了用了4种牌各几张后,当前位置就是确定的,所以不用记录什么的. #includ ...

  8. bzoj2257瓶子与燃料——最大公约数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2257 可以知道最终能够导出的燃料一定是瓶子容量的gcd的倍数,所以此题转化为求n个数中k个数 ...

  9. Apple Tree

    题意: 给一有根树,每个叶子上有一些苹果,现在要求你拿掉一些苹果,使得每一个点的 儿子的子树内的苹果数相同. 解法: 首先可以发现$cnt$个叶子节点之间的关系可以用$cnt-1$个独立方程表示出来. ...

  10. httpd基础

    hpptd http服务器应用 http服务器程序 httpd apache nginx lighttpd 应用程序服务器 IIS .asp tomcat .jsp jetty 开源的servlet容 ...