一. java为什么要引入static关键字
转载:
https://zhuanlan.zhihu.com/p/24373135?utm_source=com.example.android.notepad&utm_medium=social
首先我们对比下几种语言写hello world的方式:
可以看出Python和Scala是极其简明的,因为它们一个具体的操作可以脱离函数实体而直接运行的;C++稍微严谨一点,具体的操作需封装在函数中,执行函数来进行动作;而Java最为严格,所有的函数都必须封装在一个类中,函数不能脱离类单独存在。
这样的规定显得java尤为死板,但语法的死板意味着更少的歧义,强对象使得Java成为了学习面向对象编程的最佳入门语言。但是凡事有利就有弊,强对象使得语法简单统一,同时也带来了很多不必要的麻烦。static就是为“洗地”应运而生的。
很多变量和函数没必要封装在类中,强行封装显得很累赘,比如正则函数sin,变量π,随机函数random,这些函数或者常量值为什么要定义在类里呢?一定要定义的话,定义在哪个类里合适呢? 于是java把这些数学用到函数、常量封装在了Math类中。那么问题来了,如果用到sin,正常的写法是什么呢?
Math math = new Math();
double x = math.sin(x);
每次用到函数就要new一个Math对象,显然是很不合理的,java语言的设计者也不会这么傻,所以,static登场了!当我们用static修饰一个函数或者变量的时候,就可以在不创建对象的情况下直接调用:Math.sin(x)。
static 函数里不能使用this, super?废话!你只要明白了static 函数其实是全局函数,它只是因为Java的强对象的要求,而不得不找个类“挂靠”,它本身与任何类都没有关系。所以在static 方法里,当然不能直接访问某一个类的成员变量和成员函数了。但是呢,一个类让一个static函数挂靠了,总得有点好处吧?要说好处,倒也有一个,那就是类的成员函数调用static方法不用带类名了。
二. static关键字的三种用法
1.修饰成员变量
2.修饰静态方法
3.静态块