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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


this是当前对象的一个引用,或者表示是当前对象本身,利用this可使用当前对象的成员属性,成员方法。
当一个构造方法调用本类的另一个构造方法时,也要使用关键字this,同时这调用语句应该是整个构造函数的第一条语句。
造一个构造方法中,当用this并给他一个参数列表时,this显示调用参数匹配的另一个构造方法。
用来区分局部变量与成员变量的。
        this出现的位置
        1.构造方法. 代表是当前构造正在创建的对象。
        2.成员方法. 代表是调用这个方法的对象
super:

super和this有些类似,super是父类对象的一个引用,或者说,super表示当前对象的直接父类对象,利用super可以使用父类对象的成员变量,调用父类的方法。
super可以调用父类有参或无参数的构造方法中,子类的构造方法隐含调用父类无参数的构造方法。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
this和super,这两个变量在使用前都是不需要声明的。this变量使用在一个成员函数的内部,指向当前对象,当前对象指的是调用当前正在执行方法的那个对象。super变量是直接指向超类的构造函数,用来引用超类中的变量和方法。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
this关键字
1)在类的内部代表对象本身,this就代表这个类的对象,比如
public class A {   
private String name;  
public void setName(String name) {   
//this就代表A的一个对象     
//当你实例一个A时
A a1 = new A();  
this就是那个a1,只是this在内部用,而a1在外部用      
//A a2 = new A()同理,这时在a2的内部,this就代表a2      
this.name = name;  
}
}
2)this的第二种用法,是用在构造函数里的当在构造器里要调用自己的其他构造器时,就用thisthis必须放在第一行
public class A {   
private String name;   
public A() {      
this("no name");   
}  
public A(String name) {   
    this.name = name;      
}
}
super关键字
1)显示的调用父类的方法当从一个类继承时,子类和父类都有一个同名方法,也就是子类覆盖了父类的方法,可是又想调用父类的方法,
那么就要用super,像继承swing的类时就有个好例子
public class MyPanel extends JPanel {   
public void paint(Graphics g) {      
super.paint(g);
//如果不用super,那么就会调用自己的paint方法   
}
}
2)用在构造器,和this的用法一样,super也可以用在构造器,this是调用自己的其他构造器,
那么super当然就是调用父类的构造器了
super和this用在构造器的话,前者表示调用父类的够早器,后者表示调用本类的其他构造器,他们两个都必须是写在构造器里的第一行
public class Person {  
private String name;   
private int age;   
public Person() {      
name = "";      
age = 0;   
}  
public Person(String n, int a) {      
name = n;      
age = a;   
}
}
public class Student extends Person {   
private String id;//学号   
public Student(String name, int age) {      
super(name, age);//必须写在第一行,子类无法直接访问父类的私有属性,所以通过调用父类的构造器类初始化属性  
}  
public Student(String id, String name, int age) {      
this(name, age);//因为本类已经有个构造器初始化name和age了,所以交给他来做就行了,也必须写在第一行      
this.id = id;   
}
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
* super和this的异同:
* 1)super(参数):调用父类的构造方法 。
* 2)this(参数):调用本类的其他构造方法。
* 3)都必须放在构造方法的第一行。
* 4)super:引用父类中的成员,当子类和父类中的方法重名时,这样用。
* 5)this:代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)。
* 6)this()和super()都指的是对象,所以,均不能在static环境中使用。包括:static变量,static方法,static语句块。
* 7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
  1. class Creature extends Object{
  2.         //Creature会去调用父类Object的默认的无参构造方法
  3.         public Creature() {
  4.                 System.out.println("Creature无参数的构造器");
  5.         }
  6. }

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

  13.         public Animal(String name, int age) {
  14.                 // 使用this调用同一个重载的构造器
  15.                 this(name);
  16.                 System.out.println("Animal带2个参数的构造器,其age为" + age);
  17.         }

  18. }

  19. public class Wolf extends Animal {
  20.         public Wolf() {
  21.                 // 显式调用父类有2个参数的构造器
  22.                 super("土狼", 3);
  23.                 System.out.println("Wolf无参数的构造器");
  24.         }

  25.         public static void main(String[] args) {
  26.                 Wolf wolf = new Wolf();
  27.         }
  28. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 聂斌 于 2013-3-11 03:09 编辑




super&this用法:

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

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

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

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

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

6)子类访问父类构造方法,其格式为 super(<参数>) ,super()可以重载
7)java在执行子类构造方法之前,如果没有用super来调用父类中特定的构造方法,则会先调用父类中没有参数的构造方法。应此,如果父类中只定义了有参数的构造方法,而在子类中又没有用super来调用父类中特定的构造方法,则编译器发生错误。解决方法:在父类中构造个空方法


class Person {  
    public static void prt(String s) {  
       System.out.println(s);  
    }  

    Person() {  
       prt("A Person.");  
    }//构造方法(1)  

    Person(String name) {  
       prt("A person name is:" + name);  
    }//构造方法(2)  
}  

public class Chinese extends Person {  
    Chinese() {  
       super(); // 调用父类构造方法(1)  
       prt("A chinese.");// (4)  
    }  

    Chinese(String name) {  
       super(name);// 调用父类具有相同形参的构造方法(2)  
       prt("his name is:" + name);  
    }  

    Chinese(String name, int age) {  
       this(name);// 调用具有相同形参的构造方法(3)  
       prt("his age is:" + age);  
    }  

    public static void main(String[] args) {  
       Chinese cn = new Chinese();  
       cn = new Chinese("kevin");  
       cn = new Chinese("kevin", 22);  
    }  
}  
执行结果为:  
A Person.  
A chinese.  
A person name is:kevin  
his name is:kevin  
A person name is:kevin  
his name is:kevin  
his age is:22  



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马