static与this的那点渊源没搞懂
理解两者的作用:
this:代表的是当前类的对象,一方面用来调用当前类中的全局变量,另一方面提供给当前类的构造函数调用其他构造函数来使用;
static:形容类本身的,两种使用形式:一种是修饰静态变量,另一种是修饰静态代码块。有无需创建对象即可使用类名直接调用的特点。
------升华之后,不再只是简单记忆性理解-------
简单点讲两者其实可以看作是调用一个类属性的两种不同方式,this是通过对象方式调用,static通过类本身去调用,static不需要对象存在而实现调用目的,两者目的都是为了操作成员属性,实现最终效果也是一样的。
静态方法中能实现调用非静态成员变量吗?
答案是可以实现的,当然直接像隐式的method();显式的this.method()调用方式是肯定不行了,
间接实现方式:
通过在一个静态方法中创建当前类的对象,或者通过参数列表传入当前对象的方式,依旧都可以在静态方法中调用那些非静态变量.这种间接的方式是可以的,当然实际应用中也不会这么做的。
说到这,不知道大家是不是跟我有同样的疑问,静态方法中为什么可以创建对象,产生这个疑问的原因是创建对象的过程免不了去调用构造方法,构造方法也是方法,是没有使用static修饰的。
通过翻阅书籍才知道,其实构造函数也是一种静态方法,在初始化加载这些成员变量的时候,静态变量的加载顺序更优先于非静态成员的加载顺序,其次再是构造函数的加载,至于为什么暂时就不再作过多研究。
尽管还不是很清楚this底层是怎么实现初始化对象的,大胆猜测一下,this的实现八九不离十其实就是一个非静态方法,更确切的讲应该是工厂模式,这才决定了两者不能同时使用。至于为什么static中不能调用非静态方法,当时有的老师是这样解释的:
因为在Java之初都是使用static来声明和实现方法的,后来随着Java版本升级之后,才有了非static的方法声明方式,前者不知后者,后者知道前者。
本人尝试寻找过具体原因,其主要方向还是觉得跟初始化加载顺序有关,这个猜测的有效性,希望随着以后的不断学习能够找到答案。暂时就约定大于配置吧!
如果发现有错误的地方,还需要各位能够帮我纠正,在学习的道路上让我们一起携手进步。