第4章 类、对象和接口
1. 实例变量和类变量的区别:
如果类中的成员变量有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量,也就是说对象共享类变量。
当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类的实例成员变量不会被分配内存。但是,类变量被加载到内存时,被分配了相应的内存空间。所有的对象的类变量是相同的一处内存空间,直到程序退出运行,才释放所占有的内存。类变量不仅可以通过某个对象访问,也可以直接通过类名访问。
2. 实例方法和类方法的区别:
实例方法:当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,即方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。实例方法必须通过对象来调用。
类方法:对于类方法,在该类被加载到内存时,就分配了相应的入口地址,从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址知道程序退出才被取消。类方法中出现的成员变量必须是被所有对象共享的变量,即类变量。
3. 无论是类方法还是实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放内存。在一个方法被调用执行完毕之前,如果该方法又被调用,那么,方法的局部变量会再次被分配新的内存空间。
4. this可以出现在实例方法和构造方法中,但不可以出现在类方法中。this出现在类的构造方法中时,代表使用该构造方法所创建的对象。格式:this.实例成员变量/方法;类名.类变量/方法。通常情况下,可以省略实例成员变量名字前的“this.”以及static变量前的“类名.”,但当成员变量的名字和局部变量的名字相同时,成员变量前面的“this.”或“类名.”不可省略。