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

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

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

    在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法.this关键字的四种用法如前文所述,列举如下. 1) this(paras…); 访问其他的构造方法 2) this.xxx; 访问 ...

  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. 【WPF】推荐一款拖拉缩放控件的DEMO

    引言 在CodeProject上有个实现了控件拖拉缩放的DEMO,界面很漂亮,里面对Thumb和Adorner运用得很精彩.我觉得,使用WPF的开发者都可以去学习一下.下面放出链接. WPF Diag ...

  2. JavaScript中的数组和对象 增删遍

    由于 JavaScript 的语言特性,我们可以向通用对象动态添加和删除属性.所以 Object 也可以看成是 JS 的一种特殊的集合. 虽然这个集合的 key 只能是 String 类型,不像 Ja ...

  3. power designer 设计数据库生成到oracle数据库

    一.概念模型设计 1. 创建工程,创建概念设计模型,在快捷菜单栏调出 palette 找到表格工具,在主界面中创建表格. 2. 创建出的表格,双击进入设计模式 -------------------- ...

  4. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型

    1  守护进程: 主进程 创建 守护进程   辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...

  5. Ajax做日期选择

    1.主页面 引入JS Jquery bootstrap 包 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  6. codeforces 755F F. PolandBall and Gifts(贪心+多重背包)

    题目链接: F. PolandBall and Gifts time limit per test 1.5 seconds memory limit per test 256 megabytes in ...

  7. python whl包的安装

    1.首先安装PIP. https://pip.pypa.io/en/latest/installing.html#install-pip python get-pip.py 2.设置好环境变量: C: ...

  8. POJ - 2187:Beauty Contest (最简单的旋转卡壳,求最远距离)

    Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, earning the ti ...

  9. [BZOJ1242]Fishing Net

    dbzoj vjudge1 vjudge2 sol 给一个无向图,求判定是不是弦图. sol 还是弦图那套理论. 复杂度是\(O(n^2)\)的,因为\(m\)本质上和\(n^2\)是同级的. cod ...

  10. Js中获取键盘的事件

    使用方法: <script type="text/javascript" language=JavaScript charset="UTF-8"> ...