黑马程序员技术交流社区

标题: 关于this关键字和super关键字 [打印本页]

作者: 王楚鑫    时间: 2013-7-8 13:09
标题: 关于this关键字和super关键字
个人总结,欢迎补充~
this:它存放的值就是此对象实例的“引用”(地址),也就是“new  此类构造函数”返回
          的这个“引用值”。也就是用来引用此对象实例本身。
this(参数) :调用此类的构造函数,此种用法中的this关键字可代表此类
从用途来看,主要有3种情况:
(1)取得此对象实例本身的“引用值”

(2)在函数内指称“成员变量”,以区别于同名的“局部变量”

(3)用于构造函数内,以调用此类内其他的构造函数

练习代码
  1. import java.lang.*;

  2. class a13
  3. {       
  4.         public static void main(String[] para)
  5.   {
  6.                 System.out.println("========= test obj1 =========");         
  7.                 myClass obj1 = new myClass();
  8.                 System.out.println("obj1.getThis() = " + obj1.getThis());               
  9.                 obj1.showABC();
  10.                 System.out.println("========= test obj2 =========");
  11.                 myClass obj2 = new myClass(2,78,'C');                               
  12.                 obj2.showABC();
  13.                 System.out.println("========= test obj3 =========");
  14.                 myClass obj3 = new myClass(3,26,'E',true);                               
  15.                 obj3.showABC();       
  16.   }
  17. }
  18. class myClass
  19. {
  20.         public final myClass myThis  = this;  //引用此对象实例本身
  21.        
  22.                        
  23.         public int a;
  24.         public float b;
  25.         public  char c;  
  26.        
  27.         public myClass getThis()
  28.         {
  29.                 return this;
  30.         }
  31.        
  32.         public myClass()
  33.         {
  34.                 a = 1;
  35.                 b = 60;
  36.                 c = 'D';
  37.                 System.out.println("this = " + this);
  38.                 System.out.println("myThis = " + myThis);                       
  39.        
  40.         }
  41.        
  42.         public myClass(int a,float b,char c)
  43.         {
  44.                 this();  //在这个构造函数调用上一个构造函数内容
  45.                 this.a = a;
  46.                 this.b = b;
  47.                 this.c = c;
  48.         }
  49.        
  50.         public myClass(int a,float b,char c,boolean revise)
  51.         {
  52.                 this();
  53.                 this.a = a;
  54.                 this.c = c;
  55.                 if(revise)
  56.                         this.b = this.b * 70/100 + 30;  //注意此处b的值是60
  57.                 else       
  58.                         this.b = b;                       
  59.         }       

  60.         public void showABC()
  61.         {
  62.                 System.out.println("a = " + a + "  b = " + b + "  c = " + c );
  63.         }                       
  64. }



复制代码
super:引用该对象实例内的父类对象
super(参数) :调用父类的构造函数,此种用法中的super关键字可代表此类

从用途来看,主要有2种情况:
(1)用于构造函数内,以指定要调用父类的某个构造函数

练习代码
  1. import java.lang.*;

  2. class a14
  3. {       
  4.   public static void main(String[] para)
  5.   {
  6.     Cc obj1 = new Cc();
  7.     System.out.println("obj1.Var1 = " + obj1.Var1);
  8.     System.out.println("obj1.Var2 = " + obj1.Var2);
  9.     System.out.println("obj1.Var3 = " + obj1.Var3);
  10.     System.out.println("========================");                 
  11.     Cc obj2 = new Cc(10000);
  12.     System.out.println("obj2.Var1 = " + obj2.Var1);
  13.     System.out.println("obj2.Var2 = " + obj2.Var2);
  14.     System.out.println("obj2.Var3 = " + obj2.Var3);
  15.     System.out.println("========================");          
  16.     Cc obj3 = new Cc(555,12);
  17.     System.out.println("obj3.Var1 = " + obj3.Var1);
  18.     System.out.println("obj3.Var2 = " + obj3.Var2);
  19.     System.out.println("obj3.Var3 = " + obj3.Var3);   

  20.   }
  21. }

  22. class AaA
  23. {
  24.   int Var1;
  25.   
  26.   public AaA(int var1)
  27.   {  
  28.     //自动调用 super(),也就是 Object()
  29.     System.out.println("start in A(int var1) Var1 = " + Var1);
  30.       //可取 Var1 之值,证实在此之前 Var1 已自动初始化(为0)
  31.     Var1 = var1;
  32.     System.out.println("执行 public A(int var1)");
  33.   }
  34.    
  35.   public AaA()
  36.   {  
  37.     //自动调用 super(),也就是 Object()  
  38.     System.out.println("start in A() Var1 = " + Var1);
  39.       //可取 Var1 之值,证实在此之前 Var1 已自动初始化(为0)
  40.     Var1 = 10;
  41.     System.out.println("执行 public A()");
  42.   }
  43. }

  44. class Bb extends AaA
  45. {
  46.   int Var2;
  47.   
  48.   public Bb()
  49.   {
  50.     //自动调用 super(),A 必须要有 A() 预设构造子
  51.     Var2 = 10;
  52.     System.out.println("执行 public B()");
  53.   }
  54.    
  55.   public Bb(int var1)
  56.   {
  57.     super(var1);  //若不指定调用,则会自动调用父类的 A()
  58.     Var2 = Var1 * 2;   // 到此行 Var1 之值已初始化
  59.     System.out.println("执行 public B(int var1)");
  60.   }
  61.   

  62. }

  63. class Cc extends Bb
  64. {
  65.   int Var3;  
  66.   
  67.   public Cc()
  68.   {
  69.     //自动调用 super(),B 必须要有 B() 预设构造子
  70.     Var3 = 10;
  71.     System.out.println("执行 public C()");
  72.   }
  73.    
  74.   public Cc(int var1)
  75.   {
  76.     super(var1); //若不指定调用,则会自动调用父类的 B()
  77.     Var3 = Var2 * 2;  // 到此行 Var2 之值已初始化
  78.     System.out.println("执行 public C(int var1)");                       
  79.   }
  80.   
  81.   public Cc(int var3,int multi)
  82.   {
  83.     //不指定调用,自动调用 super(),即  B 类的 B()
  84.     Var3 = var3*multi;
  85.     System.out.println("执行 public C(double var3,int multi)");                       
  86.   }
  87. }

复制代码
2 指定使用继承而来的某成员,而非使用此类改写的成员
  1. import java.lang.*;

  2. class a15
  3. {       
  4.   public static void main(String[] para)
  5.   {                          
  6.     B obj1 = new B();
  7.     System.out.println("======= B 类之 super =======");
  8.     obj1.showBSuper();  //B 定义之方法中 super ==> A
  9.     System.out.println("======= B 类之 this =======");
  10.     obj1.showBThis();   //B 定义之方法中 this ==> B
  11.                                     
  12.     C obj2 = new C();         
  13.     System.out.println("======= C 类之 super =======");
  14.     obj2.showCSuper();  // C 定义之方法中 super ==> B                
  15.     System.out.println("======= C 类之 this =======");         
  16.     obj2.showCThis();   // C 定义之方法中 this ==> C   
  17.    
  18.             
  19.   
  20.   }
  21. }

  22. class A1
  23. {
  24.         public int Var1 = 1000;
  25.         public int Var2 = 2000;
  26.         public int Var3 = 3000;
  27.        
  28.         public void Fun1()
  29.         {
  30.                 System.out.println("AAAA ==== Fun1() in A class");
  31.         }
  32.        
  33.         public void Fun2()
  34.         {
  35.                 System.out.println("AAAA ==== Fun2() in A class");
  36.         }       
  37. }

  38. class B extends A1
  39. {       
  40.         public float Var2 = 22.22F;  //Hide 继承来的 Var2
  41.         public float Var3 = 33.33F;  //Hide 继承来的 Var3
  42.         public float Var4 = super.Var2 + 400;  //新增,仅为示范而作,尽量将初始化写于构造子之内;
  43.         public float Var5 = super.Var2 + 500;  //新增,super ==> A

  44.         public void Fun2()
  45.         {
  46.                 System.out.println("BBBB ==== Fun2() in B class");
  47.         }       
  48.        
  49.         public void showBThis()
  50.         {
  51.                 System.out.println("Var1 = " + Var1
  52.                                    + "  Var2 = " + Var2
  53.                                    + "  Var3 = " + Var3);
  54.                 Fun1();
  55.                 Fun2();       
  56.         }
  57.        
  58.         public void showBSuper()
  59.         {
  60.                 System.out.println("super.Var1 = " + super.Var1
  61.                                     + "  super.Var2 = " + super.Var2
  62.                                     + "  super.Var3 = " + super.Var3);
  63.                 super.Fun1();
  64.                 super.Fun2();       
  65.         }
  66.        

  67. }

  68. class C extends B
  69. {

  70.        
  71.         public String Var2 = "AAAA";  //Hide 继承来的 Var2
  72.         public String Var4 = "BBBB";  //Hide 继承来的 Var4
  73.        
  74.         public void Fun1()
  75.         {
  76.                 System.out.println("CCCC ==== Fun1() in C class");
  77.         }
  78.        
  79.         public void showCThis()
  80.         {
  81.                 System.out.println("Var1 = " + Var1
  82.                                     + "  Var2 = " + Var2
  83.                                     + "  Var3 = " + Var3
  84.                                     + "  Var4 = " + Var4
  85.                                     + "  Var5 = " + Var5);               
  86.                 Fun1();
  87.                 Fun2();
  88.         }
  89.        
  90.         public void showCSuper()
  91.         {
  92.                 System.out.println("super.Var1 = " + super.Var1
  93.                                     + "  super.Var2 = " + super.Var2
  94.                                     + "  super.Var3 = " + super.Var3
  95.                                     + "  super.Var4 = " + super.Var4
  96.                                     + "  super.Var5 = " + super.Var5);
  97.                 super.Fun1();
  98.                 super.Fun2();               
  99.         }
  100. }


复制代码

作者: 神之梦    时间: 2013-7-8 15:54
为小鑫鑫顶一个
作者: 王楚鑫    时间: 2013-7-8 20:53
神之梦 发表于 2013-7-8 15:54
为小鑫鑫顶一个

:victory:谢谢哟~
作者: 神之梦    时间: 2013-7-8 21:04
王楚鑫 发表于 2013-7-8 20:53
谢谢哟~

:lol                                         
作者: 小狼    时间: 2013-7-12 16:41
学习一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2