一、static
static(静态的),可以放在类、方法、字段之前。
通常,当创建类时,就是在描述那个类的外观与行为。除非用 new 创建那个类的对象,否则,实际上并未获得任何对象。执行 new 来创建对象时,数据存储空间才会被分配,其方法才可被外界调用。但是有两种情形上述方法无法解决。其一:只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象;另一种情形是,希望某个方法不与包含它的类的任何对象关联在一起,也就是说,即便没有创建对象,也能够调用这个方法。
static关键字可以满足上述要求。当声明一个事物是 static 时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起,因此,即便从未创建某各类的任何对象,也可以调用其static方法或者访问其static域。
将static关键字放在定义之前,就可以将字段或方法设定为static。
1)static类
当一个类定义为static类型时,表明这是一个静态类。如果一个类被声明为静态类,那么只有一种情况:静态内部类(嵌套类)。关于嵌套类,我会在其他地方详细说明。
2)static方法
通常,将一个方法声明为静态的,表明可以直接通过 “类名.方法名” 的方式来调用这个方法,而无需创建该类的对象,但是会有一些限制:
· 静态方法只能调用静态方法,不能在静态方法中调用非静态方法;
· 静态方法只能访问静态数据成员
· 静态方法不能以任何方式引用 this 或 super
3)static数据成员
当一个数据成员被声明为静态的时,这个数据是唯一的,因为对于每个类来说,一个static字段只有一份存储空间(非static字段是每个对象都有一份存储空间),当改变这个字段时,在程序的所有地方这个字段都会被修改。引用也很方便,直接 “类名.静态变量名”即可。
二、final
JAVA中使用final关键字,通常表明这个地方是不可被改变的。
1)final数据
final数据用来表明一个不可被修改的数据。对于基本数据类型,final使数值保持不变;对于对象引用,final使引用恒定不变,即一旦引用被初始化指向一个对象,就无法再让它改为指向另一个对象,但是对象自身是可以被修改的。对比static来说,static表明这个域只有一份存储空间,但是其值是可以改变的;final表明这是一个常量。因而既是static又是final的域只占据一段不能被改变的存储空间,类似于“全局变量”,用大写表示。
2)final方法
使用final方法可以把方法锁定,防止任何继承类修改它的含义(不可被覆盖)。final方法的速度比非final方法要快,因为在编译时已经静态绑定了,不需要进行动态绑定,只是这样带来的效率又会引起一些其他问题,现在已经不再需要final方法去进行优化,只有想要明确禁止覆盖时,才将方法设置为final的。
另外,所以private方法都隐式地声明为final的,是不能被覆盖的。当你试图在子类中覆盖父类的private方法时,你不是在覆盖,而是创建了一个与父类的该方法方法名一样的新方法。
3)final类
当一个类被定义为final时,就表明我们不打算继承该类,而且也不允许别人这样做,这个类将不会有子类。
三、this
当你需要在方法的内部获得对当前对象的引用时,需要用到this关键字。 this 关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this关键字主要有两个应用:
1)返回对当前对象的引用,因而可以在实例代码中调用本类的其他方法或成员变量:this.方法名,this.成员变量名;
2)将当前对象传递给其他方法,这样可以让构造器调用同一个类的其他构造器,只是调用时,this语句要放在构造器的第一行。另外,this只能调用一个构造器,而不能调用两个。
四、super
关键字super有两种用途:
1)调用父类的构造器:
super(); // 调用父类的无参构造器(默认构造器),子类一般都会隐式调用父类的默认构造器
super(参数); // 调用父类的与参数匹配的构造器,
super语句必须出现在子类构造方法的第一行,这是显式调用父类构造方法的唯一方法。在任何情况下,构造一个类的实例时,将会沿着继承链一一调用父类的构造器,确保初始化。
2)调用父类的方法:
super.方法名(参数);
注:this和super不能同时出现在一个构造器里面;
this()和super()均不能在static环境中使用;
可以这样理解,this是指向当前对象的,super是指向父类的。