一、概述
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可以省略
}
}