08.面向对象(5)--this、super、final、static等关键字
?
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、static8.3.1、静态变量定义为静态变量无需实例化即可访问。用static标识符修饰的变量,它们在类被载入时创建,只要类存在,static变量就存在。
class A{private static int count = 0;public A(){count = count + 1;}}?8.3.2、静态方法在方法前加static,同静态成员变量一样,我们可以用类名直接访问静态成员方法,也可以用类的实例对象来访问静态成员方法,还可以在类的非静态的成员方法中象访问其他非静态方法一样去访问这个静态方法,如下面的程序代码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();}}?在使用类的静态方法时,我们要注意以下几点:1)在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。2).静态方法不能以任何方式引用this和super关键字(super关键字在下一章讲解)。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。3).main()方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。8.4、final在Java中声明类、属性和方法时,可使用关键字final来修饰。final标记的类不能被继承。final标记的方法不能被子类重写。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也是可以的,这就限定了我们在方法中修改形式参数的值。