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

Java继承体系中this的表示关系的更多相关文章

  1. 关于Java继承体系中this的表示关系

    Java的继承体系中,因为有重写的概念,所以说this在子父类之间的调用到底是谁的方法,或者成员属性,的问题是一个值得思考的问题; 先说结论:如果在测试类中调用的是子父类同名的成员属性,这个this. ...

  2. 从基层容器类看万变不离其宗的JAVA继承体系

    以容器类为例子,可以观一叶而知秋,看看以前的前辈们是如何处理各种面向对象思想下的继承体系的.读的源代码越多,就越要总结这个继承关系否则读的多也忘得快. 首先摆上一张图片: 看到这张图很多人就慌了,难道 ...

  3. C++ 继承体系中的名称覆盖

    首先一个简单的样例: int x; int f() { double x; cin >> x; return x; } 在上述代码中.函数f的局部变量x掩盖了全局变量x.这得从 " ...

  4. C++继承体系中的内存对齐

    本篇随笔讨论一个比较冷门的知识,继承结构中内存对齐的问题,如今内存越来越大也越来越便宜,大部分人都已经不再关注内存对齐的问题了.但是作为一个有追求的技术人员,实现功能永远都是最基本的要求,把代码优化到 ...

  5. Java继承多态中的方法访问权限控制

    java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...

  6. C++继承体系中的内存分段

    ---------------综述与目录-------------- 讨论这个问题之前我们先明确类的结构,一个类的大概组成,下面的很多分类名词都是我个人杜撰,为的就是让读者看懂能够区分,下面分别分类: ...

  7. JAVA继承:编译与运行的关系(编译看左边,运行看右边)

    "成员变量,静态方法看左边:非静态方法:编译看左边,运行看右边." 意思是:当父类变量引用子类对象时(Fu f = new Zi();),在这个引用变量f指向的对象中,他的成员变量 ...

  8. Java 继承、抽象、接口

    一.继承 1. 概述 继承是面向对象的重要特征之一,当多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那多个类中无需再定义这些属性和行为,只需继承那个单独的类即可. 单独的类称为父类或超 ...

  9. Java IO体系之RandomAccessFile浅析

    Java IO体系之RandomAccessFile浅析 一.RandomAccessFile综述: 1.1RandomAccessFile简介 RandomAccessFile是java Io体系中 ...

随机推荐

  1. web项目的创建

    1) 创建Mave的webapp项目 2) 在Pom文件中添加servlet-api的依赖 <dependency> <groupId>javax.servlet</gr ...

  2. mybatis源码阅读-执行一个sql的流程(九)

    图解 图片来源:https://my.oschina.net/zudajun/blog/670373 Mapper接口调用原理 我们整合成Spring  直接使用Mapper就能执行对应的sql 表现 ...

  3. Linux下汇编语言学习笔记72 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  4. 放大的X

    Problem Description 请你编程画一个放大的’X’.如3*3的’X’应如下所示: X X XX X 5*5的’X’如下所示:X X X X X X XX X   Input 输入数据第 ...

  5. C. Hexadecimal's Numbers

    C. Hexadecimal's Numbers time limit per test 1 second memory limit per test 64 megabytes input stand ...

  6. [bzoj1617][Usaco2008 Mar]River Crossing渡河问题_动态规划

    River Crossing渡河问题 bzoj-1617 Usaco-2008 Mar 题目大意:题目链接. 注释:略. 想法:zcs0724出考试题的时候并没有发现这题我做过... 先把m求前缀和, ...

  7. 51Nod——T 1631 小鲨鱼在51nod小学

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1631 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 ...

  8. 洛谷—— P1419 寻找段落

    https://www.luogu.org/problem/show?pid=1419 题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段 ...

  9. vsftpd conf 解釋

    Linux中vsFTP位置约定:/usr/sbin/vsftpd ---- VSFTPD的主程序/etc/rc.d/init.d/vsftpd ---- 启动脚本/etc/vsftpd/vsftpd. ...

  10. linux设备驱动程序_hello word 模块编译各种问题集锦

    在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...