黑马程序员技术交流社区

标题: super和this [打印本页]

作者: z1342802487    时间: 2014-4-25 10:30
标题: super和this
本帖最后由 z1342802487 于 2014-4-26 08:59 编辑

Java中super的法并与this有什么区别?
作者: 宋美成    时间: 2014-4-25 10:47
1   this他可以用来区分局部变量和成员变量的同名情况,this代表它所在的函数所属对象的引用,哪个对象在调用this所在函数,则this就代表那个对象。当要用到当前对象的某个方法或是成员时,我们有this.XX即可,当要用到调用当前对象的另一个构造函数的时候呢,用this.XX()即可;值得注意的是this只能在非静态的方法中使用,且this语句必须是构造函数的第一行。
2    super的用法与this类似,子类访问父类的同名变量是用super.XX,super代表了父类对象的引用;当对子类对象进行初始化时,父类的构造函数也会运行,这是因为子类构造函数默认的第一行有个隐式的语句super(),会访问父类空参数的构造函数
3    只要记住,this访问的是本类的东西,super访问的是父类的东西就好,当然这两个语句非常灵活,多编程就可以体会了
作者: 小周务商    时间: 2014-4-25 13:01
我只知道this是代表本类对象。
super是代表父类引用对象。
作者: 秦久启    时间: 2014-4-25 13:28
属性访问:this访问本类中的属性,如果本类中没有此属性,则从父类中继续查找,
                  super访问父类中的属性。
方法:this访问本类中的方法,如果本类中没有此方法,则从父类中急促查找。
          super 直接访问父类中的方法。
调用构造方法:this调用本类中的构造方法,必须放在构造方法的首行。
                        super调用父类中的构造方法,必须方法子类构造方法的首行。
特殊:this表示当前对象         super没有这个功能

作者: eternallove    时间: 2014-4-25 13:33
this关键字可以出现在类中任何地方,在对象建立后为“这个对象”的参考名称。你就记住它就是指的当前类对象。
this()代表了调用当前类的构造函数,至于具体调用哪个构造函数,则视调用this()时给的字变量类型与个数而定。它调用到构造函数时只能出现在构造函数的第一行。
super关键字可以用在想调用父类方法定义,可以在调用方法前加上super关键字,它实际上可以理解为父类的意思。
super():它可以用在想执行父类中的构造函数时调用。就算子类构造函数中没有指定执行父类中哪个构造函数,默认也会调用父类中的无参构造函数最前面会默认有个super();而且和this()一样必须出现在第一行。
作者: gma103    时间: 2014-4-25 14:09
this关键字用于本类对象
super引用父类对象
作者: 千殇轮回    时间: 2014-4-25 15:01
this和super的区分:
                 this代表本类对象的引用
                super本类对象父类的引用。
                  this可以用于区分局部变量和成员变量同名的情况。
                super可以用于区分子类和父类成员变量同名的情况。
                      **一般,子类中不会出现和父类同名的成员变量,面试当中可能问到这类问题

作者: igi9009    时间: 2014-4-25 15:06
在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数。this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.
super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员方法。不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。如果你想引用父类的某种东西,则非super莫属。
下面的代码演示了上面的用法:
  1. public class DemoThis
  2. {  
  3. private String name;
  4. private int age;  
  5. DemoThis(String name,int age)
  6. {  
  7. setName(name);  
  8. //你可以加上this来调用方法,像这样:this.setName(name); 但这并不是必须的
  9. setAge(age);
  10. this.print();
  11. }   
  12. public void setName(String name)
  13. {  
  14. this.name=name;  
  15. //此处必须指明你要引用成员变量
  16. }  
  17. public void setAge(int age)
  18. {  
  19. this.age=age;
  20. }  
  21. public void print()
  22. {  
  23. System.out.println  
  24. ("Name="+name+" Age="+age);
  25. //在此行中并不需要用this,因为没有会导致混淆的东西
  26. }  
  27. public static void main(String[] args)
  28. {  
  29. DemoThis dt=new DemoThis("Kevin","22");
  30. }
  31. }
复制代码

  
这个程序,来演示super的用法:
  1. class Person
  2. {  
  3. public int c;  
  4. private String name;
  5. private int age;  
  6. protected void setName
  7. (String name)
  8. {  
  9. this.name=name;
  10. }  
  11. protected void setAge(int age)
  12. {  
  13. this.age=age;
  14. }  
  15. protected void print()
  16. {  
  17. System.out.println  
  18. ("Name="+name+" Age="+age);
  19. }
  20. }  
  21. public class DemoSuper  
  22. extends Person
  23. {  
  24. public void print()
  25. {  
  26. System.out.println("DemoSuper:");
  27. super.print();
  28. }  
  29. public static void main(String[] args)
  30. {  
  31. DemoSuper ds=new DemoSuper();
  32. ds.setName("kevin");
  33. ds.setAge(22);
  34. ds.print();
  35. }
  36. }
复制代码

作者: toselect    时间: 2014-4-25 16:39
1、this代表本类对象,可以用来区分局部变量和成员变量同名的情况,可以使用this.''来调用本类对象的成员或方法。哪个对象在调用this所在类的函数,this就代表哪个对象.所以this因为对象的存在而存在。2、而super是一个特殊的语法,表示子类调用父类的构造函数。子类的构造函数如果要引用super的话,必须把super放在函数的首位.
作者: 爱翚    时间: 2014-4-25 21:48
this和super的区别:
this代表本类对象的引用。在本类的成员函数中可以通过this调用本类的成员变量以视与局部变量相区分。
super本类所继承的父类对象的引用。在本类的成员函数中可以通过super调用本类的成员变量或者父类的成员函数。
this主要的作用就是区分局部变量和成员变量同名时,当前变量属于哪一个。
super主要的作用就是区分子类和子类所继承的父类出现成员变量或成员函数同名时,当前调用的变量或者函数属于哪一个类。
作者: 大恶魔先森~    时间: 2014-4-25 22:08
this 表示本类对象,可以在一个类的非static成员内部使用。可以表示构造函数传递。this(a,b)表示调用另外一个构造函数。这里面的this就是一个特殊语法,不是变量,没有什么类型。
super表示调用父类的构造函数。也是一个特殊语法,不是变量,没有什么类型。可以在一个类的非static成员内部使用。比如super.method()。 但是,注意,这个super.method()只是长得跟some_var.method()一样,一个语法糖而已。实质上,"super"根本不是一个变量。
作者: 小马初长成    时间: 2014-4-25 22:23
  1. /**
  2. * super和this的异同:
  3. * 1)super(参数):调用父类的构造方法 。
  4. * 2)this(参数):调用本类的其他构造方法。
  5. * 3)都必须放在构造方法的第一行。
  6. * 4)super:引用父类中的成员,当子类和父类中的方法重名时,这样用。
  7. * 5)this:代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)。
  8. * 6)this()和super()都指的是对象,所以,均不能在static环境中使用。包括:static变量,static方法,static语句块。
  9. * 7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
  10. */
  11. class Creature extends Object{
  12.         //Creature会去调用父类Object的默认的无参构造方法
  13.         public Creature() {
  14.                 System.out.println("Creature无参数的构造器");
  15.         }
  16. }

  17. class Animal extends Creature {
  18.         public Animal(String name) {
  19.                 //不管这里有不有super它都会去执行父类的无参构造方法
  20.                 //super();
  21.                 System.out.println("Animal带一个参数的构造器,该动物的name为" + name);
  22.         }

  23.         public Animal(String name, int age) {
  24.                 // 使用this调用同一个重载的构造器
  25.                 this(name);
  26.                 System.out.println("Animal带2个参数的构造器,其age为" + age);
  27.         }

  28. }

  29. public class Wolf extends Animal {
  30.         public Wolf() {
  31.                 // 显式调用父类有2个参数的构造器
  32.                 super("土狼", 3);
  33.                 System.out.println("Wolf无参数的构造器");
  34.         }

  35.         public static void main(String[] args) {
  36.                 Wolf wolf = new Wolf();
  37.         }
复制代码





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