简述java中this,和super关键字的区别和作用

super

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。

所以,super关键字有以下用法:

  • 1, 引用: 父类对象 访问父类被遮盖的属性或调用父类被覆盖的方法。
    super. :调用父类中属性或者方法
    super.父类属性名:调用父类中的属性
    super.父类方法名:调用父类中方法

  • 2,super():用在子类的构造方法中,能够决定jvm在去构造父类对象时,调用父类哪一个构造方法
    super(); 调用父类的无参构造方法
    super(实参);调用父类的有参构造方法

    super必须放在构造方法中的第一个语句
    

    如果一个构造方法的第一句话,不是this(。。。),也不是super(。。。),
    系统会默认添加 super();

  • super常常用来把构造参数传给父类,去设置父类的属性;

  • 构造方法常常用来设置属性,给属性赋值。

    构造方法中无参构造方法很重要,要尽量保证每个类都写一个无参构造方法

this关键字:

this关键字两个重要用法:

  • 1, 引用 当前对象 当实例变量和局部变量命名冲突的时候,用this,表示实例变量
    this.属性名 表示当前对象的属性
    this.方法名(实参); 表示调用当前对象的方法
    用在构造方法或者成员方法中

注意:当局部变量和成员变量 发生冲突时,使用this.进行区分
若不冲突,写不写this.都可以

  • 2, 用在构造方法中 this(参数1,参数2,….) 调用本类的其他构造方法
    必须是构造方法中的第一个语句,所以this只能用一次调用其他构造方法(同super)
    this();调用当前对象的无参构造方法
    this(实参); 调用当前对象的有参构造方法
    只能定义在构造方法内,只能定义在有效代码第一行

注意:避免构造方法的递归调用
下面程序清晰讲明了super,this关键字的区别和作用:

   class TestSuper{
    	public static void main(String[] args) {
    		 new B();//调用B  的无参构造方法
    		  System.out.println("--------------");
    		  new B("abcd");
    	}
    }
    
    class A{
    	private String name;
    	public A(){
    		System.out.println("A()");
    	}
    	public A(String str){
    		this.name = str;
    		System.out.println("A(String)"+name);
    		
    	}
    }
    class B extends A{
    	public B(){
    		super();  //默认添加,可写可不写,调用父类无参构造方法
    		System.out.println("B()");
    	}
    	public B(String str){
    		super(str);
    		System.out.println("B(String)");
    	}
    }
    
    
    
    //测试super关键字和this关键字的使用与区别
    class Super{
    	protected int a= 10;
    	public void method(){
    		System.out.println("Super method()");
    	}
    }
    //继承父类Super
    class Sub extends Super{
    	int a = 20;
    	//方法 的覆盖
    	public void method(){
    		System.out.println("Sub method()");
    	}
    
    	public void print(){
    		int a = 30;
    		System.out.println(a);//30,局部变量优先
    		System.out.println(this.a);//20    引用当前实例对象
    		System.out.println(super.a);//10  父类引用
    		method();//sub method();  
    		super.method();//Super method();
    	}
    
    }

你可能感兴趣的:(javaSE,java基础面试全攻略)