A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴琼 中级黑马   /  2012-5-26 14:10  /  2145 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

super 是父类的一个引用,this是谁是有就代表谁。在一个程序中什么时候有super,什么时候用this呢。

6 个回复

倒序浏览
本帖最后由 wangtsan 于 2012-5-26 14:23 编辑

this是带表本类对象的引用,而super是带表夫类的,当你要调用父类的成员的时候就用super关键字!
比如:
class Person
{
       String name;
       String age;
       void sleep()
               {
                         System.out.println("人睡觉");
               }

}

class Studengt extends Person
{
              void sleep()
              {
                        super.sleep();//这个时候就是引用的父类对象掉用他的sleep方法。
                        System.out.println("学生睡觉");
              }
}
回复 使用道具 举报
使用super&this调用成员变量和方法可以使用super访问父类被子类隐藏的变量或覆盖的方法。当前类如果是从超类继承而来的,当调用super.XX()就是调用基类版本的XX()方法。见示例1。
当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量。见示例2。

示例1class Person {  
  protected void print()
{       System.out.println("The print() in class Person.");    }

public class DemoSuper extends Person
{    public void print() {       System.out.println("The print() in class DemoSuper.");       super.print();// 调用父类的方法    }
      public static void main(String[] args) {       DemoSuper ds = new DemoSuper();       ds.print();    }
}


结果:The print() in class DemoSuper.The print() in class Person.
示例2
public class DemoThis {    private String name;
    public void setName(String name)
{       this.name = name;// 前一个name是private name;后一个name是setName中的参数。    }}

3.使用this表示当前调用方法的对象引用假设你希望在方法的内部获得对当前对象的引用,可使用关键字this。this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。见示例3。

示例3Button bn;…bn.addActionListener(this);

4.使用super&this调用构造子
super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)。见示例4。
this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)。 见示例5。

示例4
class Person {   
   public static void prt(String s) {       System.out.println(s);    }
    Person() {       prt("A Person.");    }
    Person(String name) {       prt("A person name is:" + name);    }}
    public class Chinese extends Person {    Chinese() {       super();// 调用父类构造函数。       prt("A chinese.");    }
    Chinese(String name) {       super(name);// 调用父类具有相同形参的构造函数。       prt("his name is:" + name);    }
    public static void main(String[] args) {       Chinese cn = new Chinese();       cn = new Chinese("kevin");    }
                  }


结果:A Person.A chinese.A person name is:kevinhis name is:kevin

示例5
Point(int a,int b){    x=a;    y=b;}Point(){    this(1,1); //调用point(1,1),必须是第一条语句。}

5.使用super&this应该注意些什么?
1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。

3)super()和this()均需放在构造方法内第一行。

4)尽管可以用this调用一个构造器,但却不能调用两个。

5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 很给力!

查看全部评分

回复 使用道具 举报
super  就是你继承了 某个类以后,你要调用父类中的参数的时候要加的引用。

比如在子类的构造函数中 代码的第一行,如果你要引用父类中特有的构造函数的时候 你就要通过 super 引用指定构造函数

  还有就是调用父类中的成员变量的时候,也要用 super
   
   this  表示的就是本类的,你可以通过 this .  调用本来的成员。

回复 使用道具 举报
/*
this 的应用:当定义类中功能时,该函数内部要调用该函数的对象时,
用this来表示这个对象p。
*/
代码示例:
class Person
{
        //String name;
        int age;
        Person(int age)
        {
                this.age = age;
        }       

        public boolean compare(Person p)
        {
                return this.age == p.age;
        public boolean compare(Person p)
        {
                return this.age == p.age;
        }

        l
}

一个类中的成员方法可以直接调用同类中的其他成员,其实我们在一个方法内部使用“this.其他成员”的引用方式和直接使用“其他成员”的效果是一样的,那this还有多大的作用呢?在有些情况下,我们还是非得用this关键字不可的 :让类的成员变量名和对其进行赋值的成员方法的形参变量同名是必要的,这样的代码谁看了都能明白这两个变量是彼此相关的,老手看到函数的定义,就能揣摩出函数中的代码,大大节省了别人和自己日后阅读程序的时间。 假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数。构造方法是在产生对象时被java系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。
回复 使用道具 举报
首先你要理解关键字this和super的意思, this: 在类的方法定义中关键字this代表使用该方法的对象的引用, 可以处理方法中成员变量和参数重名的情况。
super:调用父类的东西就要用super! 子类的构造方法中必须调用父类的构造方法, 而使用super(...)就可以调用父类的构造方法,子类不调用系统则默认调用父类的无参构造方法,子类如果不调用父类的构造方法则会编译出错!
class  Demo
{
    Demo(String s){
        this.s = s;   // this.s  是当前的对象的s    ,  s是形参
   }
}

class  Demo1 extends Demo
{
   Demo1(String s1)
  {
      super(String s1);    // 父类的构造方法  必须先调用
       this.s1 = s1 ;   //this.s1是子类对象引用
  }
}
this 通常指当前对象  super通常指父类
回复 使用道具 举报
whocases 黑马帝 2012-5-26 15:36:57
7#
super就是对父类的引用,this是自个儿,super是父亲任何时候儿子有解决不了的问题时,就可以用super召唤老子,super()是显示调用父类构造函数,这句除非有特殊需要一般情况下不用写,子类会自动调用。
补充一句:类方法中不能使用super,this 关键字;super 不能用于静态方法中(类方法)中,因为静态方法只能访问静态变量
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马