在繼承關系下,父類中的this關鍵字並不總是表示父類中的變量和方法。this關鍵字的四種用法如前文所述,列舉如下。
1) this(paras…); 訪問其他的構造方法
2) this.xxx; 訪問類中的成員變量xxx
3) this.yyy(paras…); 訪問類中的成員方法yyy
4) this; 當前類對象的引用
對第一種,無論子類是否有相同參數的構造方法,this(paras…);訪問的始終是父類中的構造方法。
對第二種,無論子類是否有覆蓋了該成員變量,this.xxx;訪問的始終是父類中的成員變量。
對第三種,如果子類重寫了該成員方法,則this.yyy(paras…);訪問的是子類的成員方法,如果子類沒有重寫該成員方法,則this.yyy(paras…);訪問的是父類的成員方法。
對第四種,this始終代表的是子類的對象。
舉例論證:
package Test_This;
public class Demo {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num);//這里定義的是父類,而成員變量沒有多態,所以即使你new的子類,依然指向父類的成員變量。
System.out.println(f.fun1());//不解釋了,就是多態。
f.show();
}
}
class Fu {
public String num = "父類成員變量";
public void show() {
System.out.println(this.num);//因為成員變量沒有多態,所以this指向當前類對象的成員變量。
System.out.println(this.fun1());//因為方法有多態,所以this指向new對象的方法。
}
public String fun1() {
System.out.println(this.num);//因為成員變量沒有多態,所以this指向當前類對象的成員變量。
return "父類調用";
}
}
class Zi extends Fu {
public String num = "子類成員變量";
public String fun1() {
System.out.println(this.num);//因為成員變量沒有多態,所以this指向當前類對象的成員變量。
return "子類調用";
}
}
運行結果

以上代碼實驗結果即可證明其論證;
在web開發中可以用這一特性,結合反射來抽取servlet方法
上代碼:這個是父類
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BaseServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// localhost:8080/Test/productServlet?method=addProduct
String method = req.getParameter("method");
if (null == method || "".equals(method) || method.trim().equals("")) {
method = "execute";
}
// 注意:此處的this代表的是子類的對象
System.out.println("baseservlet this");
System.out.println(this);
// 子類對象字節碼對象
Class clazz = this.getClass();
try {
// 查找子類對象對應的字節碼中的名稱為method的方法.這個方法的參數類型是:HttpServletRequest.class,HttpServletResponse.class
Method md = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
if (null != md) {
String jspPath = (String) md.invoke(this, req, resp);
if (null != jspPath) {
req.getRequestDispatcher(jspPath).forward(req, resp);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 默認方法
public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
return null;
}
}
子類:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.User;
import cn.itcast.service.IUserService;
import cn.itcast.service.serviceImp.UserServiceImp;
import cn.itcast.utils.MyBeanUtils;
import cn.itcast.utils.UUIDUtils;
import cn.itcast.web.base.BaseServlet;
public class UserServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
public String registUI(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return "/jsp/register.jsp";
}
//regist
public String regist(HttpServletRequest request, HttpServletResponse response) throws Exception {
//接受用戶的表單數據,將其封裝到一個對象User上
User user=MyBeanUtils.populate(User.class, request.getParameterMap());
user.setUid(UUIDUtils.getId());
user.setCode(UUIDUtils.getUUID64());
System.out.println(user);
//調用sevice用戶注冊功能
IUserService userService=new UserServiceImp();
userService.regist(user);
//轉發到個提示頁面info.jsp
request.setAttribute("msg", "用戶注冊成功,請激活");
return "/jsp/info.jsp";
}
//active
public String active(HttpServletRequest request, HttpServletResponse response) throws Exception {
//獲取用戶的激活碼
String code = request.getParameter("code");
//調用SERVICE層激活功能,返回用戶對象
IUserService userService=new UserServiceImp();
User user=userService.active(code);
System.out.println(user);
if(null!=user) {
//如果用戶不為空,可以激活,更改用戶的狀態,清空用戶的激活碼,向request放入提示消息,轉發到登錄頁面
user.setState(1);
user.setCode("");
userService.updateUser(user);
request.setAttribute("msg", "用戶激活成功,請登錄");
return "/jsp/login.jsp";
}else {
//如果用戶為空,可以失敗,向request放入提示消息,轉發到info.jsp頁面
request.setAttribute("msg", "用戶激活失敗,請重新激活");
return "/jsp/info.jsp";
}
}
//loginUI
public String loginUI(HttpServletRequest request, HttpServletResponse response) throws Exception {
return "/jsp/login.jsp";
}
//用戶登錄
//login
public String login(HttpServletRequest request, HttpServletResponse response) throws Exception {
//接受表單參數
User user=MyBeanUtils.populate(User.class, request.getParameterMap());
//調用業務層登錄功能,返回用戶對象
IUserService userService=new UserServiceImp();
User uu=userService.login(user);
if(null!=uu) {
//用戶名不為空,登錄成功,將登錄成功的用戶放入session,重定向到項目首頁
request.getSession().setAttribute("user", uu);
response.sendRedirect("/store_v4/index.jsp");
return null;
}else {
//用戶名為空,登錄失敗,向request中放入提示消息,轉發/jsp/info.jsp
request.setAttribute("msg", "用戶登錄失敗,請重新登錄");
return "/jsp/info.jsp";
}
}
//logOut
public String logOut(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.getSession().invalidate();
response.sendRedirect("/store_v4/index.jsp");
return null;
}
}
當我們需要增加一個有關Test的請求時,我們可以直接在TestServlet中添加相關方法,而不比再寫一個Servlet類。但是請求的時候記得要帶上method方法參數。
