发现java底层原理很重要,以前不懂的地方,看了一点原理就懂了好多,比如静态成员不可以直接访问非静态成员,因为静态成员实际上意思是类成员,非静态成员实际上意思是对象成员,在类加载机制中,对象是类的实例,类成员在类加载的时候已经加载到方法区了,对象成员却需要在创建对象的时候创建,对象成员创建的时间比类成员创建的时间晚,所有先创建的类成员不可以访问还没创建的对象成员。

  初始化类不是创建类的对象,重要!!!

  那么如果真要在静态方法中调用非静态方法呢,那么只可以创建一个对象,再这样调用对象.非静态方法。还有1点,java允许使用对象来调用静态成员(类成员)。静态成员是类的成员,非静态成员是对象的成员,互相调用,这样不好吧。

 

  成员变量和局部变量:

  成员变量无需显式初始化,就是给出默认值,因为在这个类的准备阶段或创建该类的实例时进行默认初始化,而局部变量包括形参,方法局部变量,代码块局部变量,其中方法局部变量,代码块局部变量需要显式初始化。

  比如在一个方法内部,定义int a;接着就输出syso(a),就会报a未初始化的错误。有的面试就会出个这样的选择题。

  如果方法中的成员变量和局部变量同名,那么局部变量会覆盖成员变量,如果想用成员变量,那么就类名.成员变量名(静态成员变量)或this.成员变量名(非静态成员变量)。

  局部变量不属于任何类或实例,所以局部变量是保存在其所在方法的栈空间中,如果局部变量是基本数据类型变量,则它的值直接保存在栈内存中,如果局部变量是引用类型的变量,则它保存的是它引用的对象或数组的地址(数组也是一种引用类型)。

  super:

  super用于限定该对象调用它从父类继承得到的实例变量或方法,不可以出现在static修饰的方法中。如果在构造器中使用super,则super用于限定该构造器初始化的是该对象从父类继承得到的实例变量,而不是该类自己定义的实例变量。