天天看點

java關鍵字——this與super的對比學習

一、概述

this表示目前類所指對象,super表示父類對象的引用

this關鍵字
this 目前類所指對象
this.字段名  表示目前類字段,此處this可以省略
this.方法名()   調用目前類方法,此處this可以省略
super關鍵字
super() 調用父類無參構造函數,僅在子類構造函數中出現,可以省略,父類無參構造函數可以隐式調用
super(參數) 調用父類指定參數構造函數,僅在子類構造函數中出現,注意不可省略,父類帶參構造函數無法隐式調用
super.字段名 子類中通路父類字段,用super.避免與子類同名字段混淆
super.方法名() 子類中調用父類函數,用super.避免與子類相同函數簽名的函數混淆

二、代碼分析

2.1 父類構造函數和子類構造函數 

代碼示意:

public class Test_thisAndSuper {

	public static void main(String[] args) {
		System.out.println("=====無參構造函數=====");
		new BallGame();
		System.out.println("=====帶參構造函數=====");
		new BallGame("basketBall");
	}

}

class Game {
	public Game() {
		System.out.println("Game non-parameter constructor");
	}

	public Game(String name) {
		System.out.println("Game parameter constructor: " + name);
	}

}

class BallGame extends Game {
	public BallGame() {
		super();// 此行代碼 可有可無 Java中,子類構造函數可以隐式調用父類無參構造函數
		System.out.println("BallGame non-parameter constructor");
	}

	public BallGame(String name) {
		super(name);
		System.out.println("BallGame parameter constructor: " + name);
	}
}           

 輸出結果:

=====無參構造函數=====
Game non-parameter constructor
BallGame non-parameter constructor
=====帶參構造函數=====
Game parameter constructor: basketBall
BallGame parameter constructor: basketBall
           

 2.2 父類字段和子類字段

public class Test_thisAndSuper {

	public static void main(String[] args) {
		System.out.println("=====無參構造函數=====");
		BallGame _ballGame_noParameter=new BallGame();
		System.out.println("=====帶參構造函數=====");
		new BallGame("basketBall");
		System.out.println("=====列印字段=====");
		_ballGame_noParameter.displayField();
	}

}

class Game {
	protected String _description="This is an interesting game";
	public Game() {
		System.out.println("Game non-parameter constructor");
	}

	public Game(String name) {
		System.out.println("Game parameter constructor: " + name);
	}

}

class BallGame extends Game {
	protected String _description="This is an interesting ballgame";
	public BallGame() {
		super();// 此行代碼 可有可無 Java中,子類構造函數可以隐式調用父類無參構造函數
		System.out.println("BallGame non-parameter constructor");
	}

	public BallGame(String name) {
		super(name);
		System.out.println("BallGame parameter constructor: " + name);
	}
	
	public void displayField(){
		System.out.println("父類字段: "+super._description);
		System.out.println("子類字段: "+this._description);
	}
}           

輸出結果:

=====無參構造函數=====
Game non-parameter constructor
BallGame non-parameter constructor
=====帶參構造函數=====
Game parameter constructor: basketBall
BallGame parameter constructor: basketBall
=====列印字段=====
父類字段: This is an interesting game
子類字段: This is an interesting ballgame           

2.3 父類方法和子類方法

public class Test_thisAndSuper {

	public static void main(String[] args) {
		System.out.println("=====無參構造函數=====");
		BallGame _ballGame_noParameter=new BallGame();
		System.out.println("=====帶參構造函數=====");
		new BallGame("basketBall");
		System.out.println("=====列印字段=====");
		_ballGame_noParameter.displayField();
		System.out.println("=====列印方法調用=====");
		_ballGame_noParameter.displayFunction();
	}

}

class Game {
	protected String _description="This is an interesting game";
	public Game() {
		System.out.println("Game non-parameter constructor");
	}

	public Game(String name) {
		System.out.println("Game parameter constructor: " + name);
	}
protected void  playing() {
	System.out.println("This game is so interesting");
}
}

class BallGame extends Game {
	protected String _description="This is an interesting ballgame";
	public BallGame() {
		super();// 此行代碼 可有可無 Java中,子類構造函數可以隐式調用父類無參構造函數
		System.out.println("BallGame non-parameter constructor");
	}

	public BallGame(String name) {
		super(name);
		System.out.println("BallGame parameter constructor: " + name);
	}
	
	public void displayField(){
		System.out.println("父類字段: "+super._description);
		System.out.println("子類字段: "+this._description);//此處this可以省略
	}
	
	protected void  playing() {
		System.out.println("This ballgame is so interesting");
	}
	
	public void displayFunction(){
		System.out.print("父類方法: ");
		super.playing();
		System.out.print("子類方法: ");
		this.playing();//此處this可以省略
	}
}           
=====無參構造函數=====
Game non-parameter constructor
BallGame non-parameter constructor
=====帶參構造函數=====
Game parameter constructor: basketBall
BallGame parameter constructor: basketBall
=====列印字段=====
父類字段: This is an interesting game
子類字段: This is an interesting ballgame
=====列印方法調用=====
父類方法: This game is so interesting
子類方法: This ballgame is so interesting           

2.4 this和super同時出現

關于子類構造函數中可以同時出現super和this關鍵字,但是super和this不能同時調用構造函數:

public class Test_thisAndSuper {

	public static void main(String[] args) {
		System.out.println("=====無參構造函數=====");
		BallGame _ballGame_noParameter=new BallGame();
		System.out.println("=====帶參構造函數=====");
		new BallGame("basketBall");
		System.out.println("=====列印字段=====");
		_ballGame_noParameter.displayField();
		System.out.println("=====列印方法調用=====");
		_ballGame_noParameter.displayFunction();
		
	}

}

class Game {
	protected String _description="This is an interesting game";
	public Game() {
		System.out.println("Game non-parameter constructor");
	}

	public Game(String name) {
		System.out.println("Game parameter constructor: " + name);
	}
	

protected void  playing() {
	System.out.println("This game is so interesting");
}
}

class BallGame extends Game {
	protected String _description="This is an interesting ballgame";
	public BallGame() {
		super();// 此行代碼 可有可無 Java中,子類構造函數可以隐式調用父類無參構造函數
		System.out.println("BallGame non-parameter constructor");
	}

	public BallGame(String name) {
		super(name);
		System.out.println("BallGame parameter constructor: " + name);
	}
	public BallGame(String test1,String test2){
		//super(test1);
		//this(test1);  super()和this()都要放在第一行  自相沖突  編譯時報錯
		//小結:super和this可以同時出現,即使是在子類構造方法中也可以同時出現,但是不同同時調用構造方法,
		
		//理論解釋:因為在一個構造方法中,隻能通路一次其它的構造方法(不管是父類的還是子類的)是以此時不能同時用super和this關鍵字來調用構造方法,隻能根據需求選其一。
		//簡單了解:調用構造函數時,兩個都要放第一,自相沖突
	}
	public void displayField(){
		System.out.println("父類字段: "+super._description);
		System.out.println("子類字段: "+this._description);//此處this可以省略
	}
	
	protected void  playing() {
		System.out.println("This ballgame is so interesting");
	}
	
	public void displayFunction(){
		System.out.print("父類方法: ");
		super.playing();
		System.out.print("子類方法: ");
		this.playing();//此處this可以省略
	}
}