在阅读本篇文章之前,我总结的基本都是从网上看到的,所以不一定是对的!为了防止意外出现的误导,本篇仅供参考!具体的还需要你去自己动手操作实践!另:如有大牛,本人期待指点。。。
从上午开始到中午P事没干就看别人写的东西了,深知这行是个动手的行业,但有时还是管不住自己!所以导致别人写的东西看不懂!午饭过后花了3个小时边敲边整理了一下关于static关键字的东西!
一是为了从基础慢慢来,而是为了整理一下关于static的题库,方便以后面试使用!
任何事应该先从基础来,不要心急!心急只会让你偏离航线!------ 鲁迅
ps.其实是我说的
正文开始:---------------------------------------------------------------------------------------------------------------------------------------------------------
什么是static方法(静态方法、类方法)?
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。
而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途!
(来源):Java编程思想.
在Java编程思想中这段话简单的介绍了static的用途!但是具体怎么用,需要自己的摸索!
什么是static变量?
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
先从问题入手!
(1)是否可以从一个static方法内部调用一个非static方法?
答:正确答案是:不可以!
static无法调用非static方法(实例方法),因为调用非static方法必须创建一个对象才可以调用,又称实例方法,实例方法是属于某一个对象的!(创建的对象也可以调用static方法!)而static是属于某一个类的,是通过类名直接来调用的。当调用一个static方法时,可能还没有创建任何实例对象,此时不能调用非static方法!
static方法是属于某个类的,可以直接用类名去调用(类名.方法名)。
上一段代码进行验证:
package com.test.teststatic;
public class Test {
//先创建一个static方法
public static void show(){
System.out.println("这是静态方法...I Love coding...");
noStatic(); /**报错:Cannot make a static reference to the non-static method noStatic() from the type Test
意思是:无法从非测试类型中对非静态方法进行静态引用
就是:不能在静态方法中调用非静态方法!
*/
}
//再创建一个非static方法
public void noStatic(){
System.out.println("这是个实例方法...");
show(); /**相反,在非静态方法中可以调用静态方法*/
}
}
ps:有个朋友说:(可以在静态方法内创建对象使用对象进行调用),但是我觉得没啥卵用,我个人理解是:在静态方法内创建了一个对象对非静态方法进行调用,那是对象在调用,不是通过静态方法进行的调用!但是我又觉得我的思维受到了限制,又想不通自己的逻辑点哪错了!希望有大神指点一下!
(2)static(类方法、静态)方法和非static(实例方法)方法的区别?
static方法 非static方法(实例方法)
一个是类共同拥有的 一个是类独立拥有的
内存空间上是固定的 空间在各个附属类里面分配
先分配静态对象的空间 再分配非静态对象的空间(初始化顺序的不同)
(3)定义static方法意味着什么?
1.此方法内部不能引用非static变量;
2.此方法不能被子类重写为非static方法;
3.父类的非static方法不能被子类重写为static方法。
4.一旦定义static方法不得将方法体内的局部变量声明为static;
5.static代码块可以用static{}来完成,在类被第一次装载时执行初始化,先于静态方法和其他方法的执行
若有多个静态代码块,则JVM按照它们出现在类中的先后顺序依次执行它们且每个代码块只会被执行一次。
(4)关于static方法调用static方法的!
直接使用类名.方法名即可调用!还可以直接调用本包当中所有非private权限的静态方法!
(5)使用static对象有什么好处?
1.静态对象的数据在全局是唯一的,一改都改。如果你想要处理的东西是整个程序中唯一的,弄成静态是个好方法。
2.非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。
3.静态对象和非静态对象都是对象,是对象都是要实例化的。不同之处就是2者的数据表现和存储方式不一样。
4.引用方便:对于公用类型的变量,直接用 类名.静态方法名 或者 类名.静态变量名就可引用并且直接可以修改其属性值,不用getter和setter方法。
5.保持数据的唯一性。此数据全局都是唯一的,修改他的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。
如果想理解的更深一点就是:在编译期间静态方法的行为就已经确定,而实例方法只有在运行期间当实例确定之后才能确定
如有后续发现之后继续更!
因为多数是搜集网络他人上的博客,仅供参考的时候方便而已,尊重他人的劳动果实,以下附上地址:
https://www.cnblogs.com/-0_0-/articles/1962368.html
http://www.cnblogs.com/dolphin0520/p/3799052.html
https://blog.csdn.net/weixin_36513603/article/details/53999487