JVM的垃圾回收机制是由一条后台线程执行的,其自己也是很是消耗内存的,所以,滥用建立对象,会致使性能大大降低,对内存的分配的了解就显得尤其重要java
形参:存在于方法签名中定义的局部变量,有方法调用者为其赋值,随着方法的结束而消亡git
方法内部变量:在方法内部定义的局部变量,必须在方法内对其进行显示初始化,随着方法的结束而消亡github
代码块内部的局部变量:在代码块内定义的局部变量,必须在代码块内对其显式初始化,随着代码块结束而消亡微信
实例变量:非静态的成员变量,随着对象的产生,进行初始化等操做,对象结束变量也就消亡ide
类变量:静态的成员变量,带有static修饰符,随着类初始化产生,随着类消失而消失性能
在建立变量的时候,必定要合法的前向引用。其含义就是先定义的变量不能引用后定义的变量,反之则能够网站
在同一个JVM中每个类只会存在一个Class对象,所以JVM只要分配一块内存空间给类变量就能够了,而实例变量则每次建立对象都要为其分配一块内存,几个实例就要建立几块内存空间this
定义变量的时候spa
代码块中线程
构造器中
定义实例变量时指定的初始值、初始化块中为实例变量指定初始值的语句的地位是平等的,当通过编译器处理后,他们都将被提取到构造器中,也就是说在编译后,初始化都会被放在构造器中按前后顺序进行初始化赋值
同一个JVM中,类变量只能初始化一次
定义变量的时候
静态代码块
在建立Java对象的时候,都会先去执行该类的父类对象的非静态代码块和构造器,最后才是该类的非静态代码块和构造器
所谓的隐式调用和显式调用,其实就是有没有用super去调用父类的构造器的区别。
若是父类还没被初始化过,则会最早对类变量进行初始化
子类的方法能够访问父类的实例变量,这是由于子类继承父类就会得到父类的成员变量和方法,但父类的方法不能访问子类的实例变量,由于父类没法知道哪一个子类继承他
并且子父类中的成员变量(类变量和实例变量)是相互独立的,父类中的成员变量不会被子类中同名的变量覆盖
class Base { static int count = 2; } class Mid extends Base { static int count = 20; } public class Sub extends Mid { static int count = 200; public static void main(String[] args) { // 建立一个Sub对象 Sub s = new Sub(); // 将Sub对象向上转型后赋为Mid、Base类型的变量 Mid s2m = s; Base s2b = s; // 分别经过3个变量来访问count实例变量 System.out.println(s.count); System.out.println(s2m.count); System.out.println(s2b.count); } }
结果
200
20
2
当建立Sub的时候,会初始化Base、Mid和Sub三个对象,同时也就存在三个count变量了,也就是说有三块内存保存着这三个对象和count变量,以s2m变量为例,s2m拥有的地址是Sub对象的堆地址,但s2m变量类是是Mid,则会去寻找Mid下的变量值
也就说成员变量的值取决于声明该变量声明时是所用的类型
子类能够重写父类的方法,子类也能够经过super的方式调用父类的方法,在多态的状况下,子类重写的方法会覆盖掉父类的方法
class Base{ int count =2; public void display(){ System.out.println(this.count); } } class Derived extends Base{ int count =20; @Override public void display() { System.out.println(this.count); } } public class FieldAndMethod { public static void main(String[] args) { Base b=new Base(); System.out.println(b.count); b.display(); Derived d=new Derived(); System.out.println(d.count); d.display(); Base db=new Derived(); System.out.println(db.count); db.display(); Base b2d=d; System.out.println(b2d.count); } }
结果
2
2
20
20
2
20
2
一切在你执行这段代码以后,你就会明白一切了。
更多内容能够关注微信公众号,或者访问AppZone网站