首先从区别上来讲
1、本质来说,this是指向本类对象的一个指针,而super是Java中的一个关键字;
2、同样是指向对象,this是指向本类中的对象,而super是引用父类中的引用;
再从使用上来说
1、this和super都是方法层面的,因此不能在静态中使用,包括静态方法,静态成员,静态块;具体原因见这里
2、在子类的构造方法中调用父类构造方法时,super()
必须位于子类构造方法的第一行,否则就会报错,这是因为构造方法在一开始初始化时就会被调用,为了防止子类构造方法调用父类中的成员,因此必须要先对父类的构造方法调用。
3、this()
方法也需要在本实例的构造方法的第一行调用,不过this()
在有参的构造方法中调用,this(有参)
需要在无参的构造方法中调用。
------------------------this---------------------------
例如
private void setMethod(String book) {
this.book = book;
}
这个例子可以看出来,成员变量和setMethod()方法中的形式参数的名称相同,因此为了区分两个book,用this.book来表示本类中的成员变量book。实际上 this.book = book 的作用就是将形参的值赋给本类的成员变量。因此,this的一个很大的用途就是调用成员变量和成员方法。
如果不使用this,只是写成 book = book, 那么只是把参数book赋值给了参数变量本身而已,成员变量book的值并没有发生改变,因为参数book在方法的作用于中覆盖了成员变量book。
this()
的使用
public class SuperTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThisTest test = new ThisTest();
// test.TestMethod();
}
}
class ThisTest{
public ThisTest() {
// this("无参构造方法被调用");
System.out.println("无参构造方法");
}
ThisTest(String s) {
this();
System.out.println("有参构造方法");
System.out.println(s);
}
}
这里是在有参构造方法中调用无参构造方法,运行结果
同样的,也可以在无参构造方法中调用有参的
public class SuperTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThisTest test = new ThisTest();
// test.TestMethod();
}
}
class ThisTest{
public ThisTest() {
this("无参构造方法被调用");
System.out.println("无参构造方法");
}
public void TestMethod() {
System.out.println("TestMethod方法");
}
ThisTest(String s) {
// this();
System.out.println("有参构造方法");
System.out.println(s);
}
}
运行结果
------------------------super---------------------------
说到super就不得不提到类的继承。下面这个例子来看一下super在继承中的用法。
public class SuperTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ChildTest test = new ChildTest();
test.TestMethod();
}
}
class ThisTest{
public ThisTest() {
System.out.println("父类的构造方法");
}
public void TestMethod() {
// Test.
System.out.println("父类的TestMethod方法");
}
}
class ChildTest extends ThisTest{
public ChildTest() {
super();
// super.TestMethod();
}
@Override
public void TestMethod() {
// TODO Auto-generated method stub
super.TestMethod();
System.out.println("子类重写的方法");
}
}
上面的例子中有两个类,一个是ThisTest类,一个是继承自ThisTest的ChildTest的子类。在子类中,可以通过super()
重写父类中的构造方法,不过由于构造方法是在对象被初始化的时候调用,使用在子类中即使不重写父类的构造方法也是会调用的。另外就是可以通过super.
调用父类中的其他成员方法。比如在上面的例子里,重写了父类的TestMethod()
方法,就自动调用了父类的被重写的方法
执行上面的程序
可以看到这里的super.TestMethod()
便成功调用了父类的TestMethod()
方法。而若是注释掉super.TestMethod()
这一句
执行程序
可以看出来就没有再继续调用到父类的方法。
.
.
.
欢迎交流和指正