Java的繼承體系中,因為有重寫的概念,所以說this在子父類之間的調用到底是誰的方法,或者成員屬性,的問題是一個值得思考的問題;
先說結論:如果在測試類中調用的是子父類同名的成員屬性,這個this.成員 屬性的值就是父類中這個成員屬性的值,因為在Java中沒有重寫成員屬性這一概念
,如果調用的是同名的成員方法的話,那就應該調用的是重寫后的成員方法.....如果子類中沒有這個成員方法,則向父類中尋找.
上代碼支持論證:
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; } }
當請求到servlet后,在servlet
