创建对象和this、static、final关键字
创建对象
创建一个对象的步骤
- 分配对象空间,并将对象成员变量初始化为0或空或false
- 执行属性值的显式初始化
- 执行构造方法(执行前第一步已建好,只是进一步初始化)
- 返回对象的地址给相关的变量
this关键字
本质
this的本质就是“创建好的对象的地址”。由于在构造方法执行前,对象已经创建,因此,在构造方法中也可以使用this代表“当前对象”。
用法
- 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
- 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
- this不能用于static方法中。因为static方法位于堆中的方法区中,方法区中包含的是一些不会发生改变的数据,不会包含对象,所以不能包含this。(强行解释,看了static关键字的解释就懂了)。
static关键字
特性
- 在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
- static修饰的成员变量和方法,从属于类;普通变量和方法从属于对象。即对象的成员变量会随着对象的回收被回收,而static变量在程序中被修改后会一直保持被修改后的值,直到下一次被修改,且持续到程序执行结束。
- 静态方法中不能有非静态方法。
static语句块(静态初始化块)
语句块
定义:用花括号扩起的任意数量的简单java语句。块中的局部变量以块为作用域。就是没有方法名的程序段。
静态初始化块
作用:用于类的初始化操作。既然是初始化,那么必然是第一个被执行语句块。
示例:
/**
* 用来测试静态初始化块
* @author dxt
*
*/
public class User {
int id;
String name;
String pwd;
static String company;
//静态初始化块
static{
System.out.println("一寸光阴一寸金");
company = "SXT";
printCompany();
}
/**
* 输出company
*/
public static void printCompany(){
System.out.println(company);
}
public static void main(String[] args){
company = "DXT";
printCompany();
}
}
结果:
即main()是程序的入口,静态初始化块先于main()执行。
一个问题
问: 忽然想到一个问题,main()是不是静态方法呢?即为什么main()中可通过建立对象,调用非静态方法?
答: 静态方法不可以调非静态全局变量,从内存的角度看,就是当类被加载的时候静态方法和静态属性(全局静态变量)被加载到内存(堆中的方法区)中,就是在内存中开辟一段内存地址用来保存静态方法和静态属性,这时候没有被实例化的类在内存中是不存在的,所以静态方法是不能访问非静态的全局变量。在类被实例化的时候,就是new 某个类的时候,在内存中给这个类开辟一些内存空间保存这个类的对象,这个时候就可以用静态方法去访问非静态的全部变量。main()是静态方法。
答案来自百度知道中的一个回答(略作修改),答题者为wang_wenshuai,问题及答案链接为:链接
final关键字
- final修饰变量,则一旦赋了初值,就不能被重新赋值。
- final修饰方法,该方法不能被子类重写,但是可以重载。
- final修饰类,修饰的类不能被继承。