Java学习之 super & this

在说到super关键字之前,先介绍一下this关键字,两者对比的来学习。

this——指向当前实例对象的应用

简单的说,this就是一个指向当前实例对象的指针,this的常用方法有以下几种

  1.     调用当前对象的属性或者方法
  2.     作为返回值返回当前对象的引用
  3.     可以在一个构造方法内部中使用this调用另外一个构造函数
  4.     区别属性和局部变量
以下代码注释编号对应上面的功能


  1. public class Demo {
    	int num;
    	String name;
    	public Demo(){
    		num=10;
    	}
    	public Demo(String name)
    	{
    		this();    //3.调用构造函数,没有参数视为调用无参构造函数,只能出现在第一行
    		this.name=name;    //4.this对当前对象属性的调用,区别属性和局部变量
    	}
    	public void print(){
    		System.out.println("num="+this.num);
    		System.out.println("name="+this.name);
    	}
    	public Demo addNum(){
    		this.num++;         //1.调用当前对象的属性
    		return this;        //2.返回当前对象的引用
    	}
    	public static void main(String[] args) {
    		Demo exp=new Demo("sdf");
    		exp.print();
    		exp.addNum().addNum().addNum().print();       //返回的当前对象再次调用addNum()方法实现累加
    	}
    

    执行出来的结果是:
    num=10
    name=sdf
    num=13
    name=sdf
    这里需要注意一下:在使用在构造方法内部使用this关键字调用其他的构造方法时,调用的代码只能出现在构造方法的内部的第一行可执行代码,即这样使用this调用构造方法只会出现一次。

         在构造方法里面使用this调用其他构造方法的好处是:当构造方法比较多时,可以只书写一个构造方法的内部功能代码,然后其他的构造方法都通过调用该构造方法实现,这样即保证了所有的构造是统一的,也能够有效的降低代码的重复率,方便之后的程序修改。

super——表明当前对象的父类型的引用或者父类型的构造方法

常用方法和this类似,只不过super针对的是父类:

  1. 调用父类的方法或者属性
  2. 当父类未曾定义无参构造函数时,可以在子类的构造方法中使用super调用含参的父类构造方法。

贴上代码:

package com.LearningJava.dyp;

class Par{
	int a;
	/*public Par(){
		a=1;
	}*/
	public Par(int a){
		//this();
		this.a=a;
	}
	public void Print(){
		System.out.println("a="+a);
	}
}
public class Demo extends Par{
	int b=1;
	public Demo(){
		super(4);            //2.调用父类有参构造函数,且该语句要放在第一行
		b=0;
	}
	public void Print(){
		super.Print();        //调用父类的Print()方法
		System.out.println("b="+b);
	}
	public static void main(String[] args) {
		Demo demo=new Demo();
		demo.Print();
	}
}
/////
运行结果如下:
a=4
b=0 
这里需要注意,如果没有使用super(4),则会报以下错误:

            Implicit super constructor Par() is undefined. Must explicitly invoke another constructor

意思就是父类已经定义了有参构造方法,那么就不能调用默认的无参构造方法,所以需要在子类的构造方法中手动调用父类的构造方法。

还需注意的是:super()调用父类构造方法需要放在子类构造方法中的第一行,否则会报错,也由此可见,一个构造方法中,不能同时存在super()和this(),因为他们都是要处于第一行的位置。




猜你喜欢

转载自blog.csdn.net/dypnlw/article/details/79367622
今日推荐