在继承关系下,父类中的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方法参数。

最新文章

  1. 图解Netty之Pipeline、channel、Context之间的数据流向。
  2. js一些代码方法
  3. tyvj 1057 dp 变形背包
  4. NSAttributedString之设置字间距与行间距
  5. Python基础 练习题
  6. 深入理解7816(3)-----关于T=0
  7. 用JS添加和删除class类名
  8. Ch1. Intro to Programming
  9. Docker 三剑客之 Docker Swarm(基于 overlay 组网通信)
  10. code runner 使用教程
  11. Mac上重置mysql 5.7密码
  12. 解决svn图标不显示(绝对有用)
  13. H5+混合移动app应用开发——app升级
  14. django--orm关系字段(ForeignKey、OneToOneField、ManyToManyField)详解
  15. 全文检索 -- Solr从概念到实战(一)
  16. vue系列之项目结构
  17. weblogic隐藏版本号教程(10.3.6为例)
  18. DNS泛解析配置
  19. 数学图形之贝塞尔(Bézier)曲面
  20. 让linux history命令显示命令的运行时间、在哪个机器运行的这个命令

热门文章

  1. 解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"
  2. java中String,int,Integer,char、double类型转换
  3. NEU 1351 Goagain and xiaodao's romantic story I
  4. JS中showModalDialog 详细使用方法
  5. golang 的GOPATH设置的问题
  6. hdu 3555 Bomb 【数位DP】
  7. Leet Code OJ 26. Remove Duplicates from Sorted Array [Difficulty: Easy]
  8. jqury+css实现可弹出伸缩层
  9. Android开发之使用sqlite3工具操作数据库的两种方式
  10. linux 统计 文件夹信息