当我们在写大量代码的时候往往忽略了最基本的东西 ,在这里我跟大家分享一下this,super,final的用法
Android 中this主要有三种用法:
1、表示对当前对象的引用
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始
例子:
1、表示对当前对象的引用
this指的是当前对象,你在一个类里调用this,就是调用这个类的对象,如果你在一个内部类里调用this,这个this所指的 是这个内部类,而程序如果需要的是外部类的对象,就使用使用 类名.this,这是因为内部类可以直接访问外部类的属性和方法
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始
Android 中super主要用法:
class Person { 2 public int c; 3 private String name; 4 private int age; 5 protected void setName(String name){ 6 this.name=name; 7 } 8 protected void setAge(int age){ 9 this.age=age; 10 } 11 protected void print(){ 12 System.out.println("Name="+name+" Age="+age); 13 } 14 } 15 public class DemoSuper extends Person{ 16 public void print(){ 17 System.out.println("DemoSuper:"); 18 super.print(); 19 } 20 public static void main(String[] args){ 21 DemoSuper ds=new DemoSuper(); 22 ds.setName("kevin"); 23 ds.setAge(22); 24 ds.print(); 25 } 26 }
在DemoSuper中,重新定义的print方法覆写了父类的print方法,它首先做一些自己的事情,然后调用父类的那个被覆写了的方法。输出结果说明了这一点:
DemoSuper:
Name=kevin Age=22
这样的使用方法是比较常用的。另外如果父类的成员可以被子类访问,那你可以像使用this一样使用它,用“super.父类中的成员名”的方式,但常常你并不是这样来访问父类中的成员名的。
在构造函数中
构造函数是一种特殊的方法,在对象初始化的时候自动调用。在构造函数中,this和super也有上面说的种种使用方式,并且它还有特殊的地方,请看下面的例子:
1 class Person { 2 public static void prt(String s){ 3 System.out.println(s); 4 } 5 Person() { 6 prt("A Person."); 7 } 8 Person(String name) { 9 prt("A person name is:"+name); 10 } 11 } 12 public class Chinese extends Person{ 13 Chinese() { 14 super(); //调用父类构造函数(1) 15 prt("A chinese.");//(4) 16 } 17 Chinese(String name) { 18 super(name);//调用父类具有相同形参的构造函数(2) 19 prt("his name is:"+name); 20 } 21 Chinese(String name,int age) { 22 this(name);//调用当前具有相同形参的构造函数(3) 23 prt("his age is:"+age); 24 } 25 public static void main(String[] args) { 26 Chinese cn=new Chinese(); 27 cn=new Chinese("kevin"); 28 cn=new Chinese("kevin",22); 29 } 30 }
在这段程序中,super后加参数的是用来调用父类中具有相同形式的构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在 Chinese的各个重载构造函数中,this和super.prt”(因为它是父类中的方法且可被子类访问因为子类是内部类),它照样可以正确运行。但这样似乎就有点画蛇添足的味道了。
最后,写了这么多,如果你能对“this通常指代当前对象,super通常指代父类”这句话牢记在心,那么本篇便达到了目的.
Android 中static与final主要用法:
static
final
public class TestStaticFinal {
private static final String strStaticFinalVar = "aaa";
private static String strStaticVar = null;
private final String strFinalVar = null;
private static final int intStaticFinalVar = 0;
private static final Integer integerStaticFinalVar = new Integer(8);
private static final ArrayList<String> alStaticFinalVar = new ArrayList<String>();
private void test() {
System.out.println( "-------------值处理前----------");
System.out.println( "strStaticFinalVar=" + strStaticFinalVar + "");
System.out.println( "strStaticVar=" + strStaticVar + "");
System.out.println( "strFinalVar=" + strFinalVar + "");
System.out.println( "intStaticFinalVar=" + intStaticFinalVar + "");
System.out.println( "integerStaticFinalVar=" + integerStaticFinalVar + "");
System.out.println( "alStaticFinalVar=" + alStaticFinalVar + "");
//strStaticFinalVar="哈哈哈哈";//错误,final表示终态,不可以改变变量本身.
strStaticVar = "哈哈哈哈"; //正确,static表示类变量,值可以改变.
//strFinalVar="呵呵呵呵"; //错误, final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
//intStaticFinalVar=2; //错误, final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
//integerStaticFinalVar=new Integer(8); //错误, final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
alStaticFinalVar.add( "aaa"); //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途。
alStaticFinalVar.add( "bbb"); //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途。
System.out.println( "-------------值处理后----------");
System.out.println( "strStaticFinalVar=" + strStaticFinalVar + "");
System.out.println( "strStaticVar=" + strStaticVar + "");
System.out.println( "strFinalVar=" + strFinalVar + "");
System.out.println( "intStaticFinalVar=" + intStaticFinalVar + "");
System.out.println( "integerStaticFinalVar=" + integerStaticFinalVar + "");
System.out.println( "alStaticFinalVar=" + alStaticFinalVar + "");
}
public static void main(String args[]) {
new TestStaticFinal().test();
}
}