8、this、super、final、static等关键字
8.1、this关键字
1).我们想通过构造方法将外部传入的参数赋值给类成员变量,构造方法的形式参数名称与类的成员变量名相同。
class Person{
String name;
Public Person(String name){
name=name;
}
}
2).假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数,程序代码如下:
class Container{
Component comp;
public void addComponent(){
comp = new Component(this);//将this作为对象引用传递
}
}
class Component{
Container myContainer;
public Component(Container c){
myContainer = c;
}
}
3). 构造方法是在产生对象时被Java系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。
public class Person{
String name;
int age;
public Person(String name){
this.name = name;
}
public Person(String name,int age){
this(name);
this.age = age;
}
}
8.2、super
super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。
不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。
第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。
第三、当子类的成员方法覆盖(重写)了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。
8.3、static
class A{
private static int count = 0;
public A(){
count = count + 1;
}
}
8.3.2、静态方法
class Chinese{
static void sing(){
System.out.println(“啊!” );
}
void singOurCountry(){
sing();
//类中的成员方法也可以直接访问静态成员方法
}
}
class TestChinese{
public Static void main(String [] args){
Chinese.sing();
//上面的程序代码直接使用了“类名.成员”的格式
Chinese ch1 = new Chinese();
ch1.sing();
//上面的程序代码直接使用了“对象名.成员”的格式
ch1.singOurCountry();
}
}
在使用类的静态方法时,我们要注意以下几点:
8.4、final
final int X=3;
X=4; //出错
final标记的成员变量必须在声明的同时或在该类的构造方法中显式赋值,然后才能使用。
class Test{
final int X=3;
}
class Test{
final int X;
Test(){
X=3;
}
}
方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。这种情况下,将一个形参定义成final也是可以的,这就限定了我们在方法中修改形式参数的值。