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

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

原文地址:https://www.cnblogs.com/YangGC/p/9026170.html

时间: 2024-10-09 01:33:24

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

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

首先一个简单的样例: int x; int f() { double x; cin >> x; return x; } 在上述代码中.函数f的局部变量x掩盖了全局变量x.这得从 "C++的名字查找机制"说起,首先.在函数f的局部作用域中查找.(甚至是语句块).假设不存在,到上一层的作用域再进行查找,... 该命名空间中查找,最后是全局作用域. 在类的继承体系中,名字覆盖问题也是非常困扰的.此处的"名字"但是是函数名,变量名,typedef, enum都能

Java继承类中static成员函数的重写

在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行. 也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性.让我们测试一下: 1 class testClass1{ 2 static void SMothod(){ 3 System.out.println("static in testClass1"); 4 } 5 } 6 class testClass2 extends

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

“成员变量,静态方法看左边:非静态方法:编译看左边,运行看右边.” 意思是:当父类变量引用子类对象时(Fu f = new Zi();),在这个引用变量f指向的对象中,他的成员变量和静态方法与父类是一致的,他的非静态方法,在编译时是与父类一致的,运行时却与子类一致(发生了复写). 例: class Fu { intnum = 5; static void method4() { System.out.println("fu method_4"); } void method3() {

JAVA设计模式-装饰设计模式-继承体系的由来和装饰类的优化

首先看一下我们设计类的过程: 专门用于读取数据的类 MyReader l--MyTextReader:根据不同的功能会不断延伸很多子类 l--MyMeidaReader l--MyDataReader l--.......... 为了提高以上子类的工作效率,需要加入缓冲区技术.所以又会出现下面的类的继承体系. (体系1) MyReader l--MyTextReader:根据不同的功能会不断延伸很多子类 l--MyBufferedTextReader l--MyMeidaReader l--My

Java日志体系居然这么复杂?——架构篇

摘自:https://www.cnblogs.com/xuningfans/p/12151851.html 本文是一个系列,欢迎关注 日志到底是何方神圣?为什么要使用日志框架? 想必大家都有过使用System.out来进行输出调试,开发开发环境下这样做当然很方便,但是线上这样做就有麻烦了: 系统一直运行,输出越来越多,磁盘空间逐渐被写满 不同的业务想要把日志输出在不同的位置 有些场合为了更高性能,尽量控制减少日志输出,需要动态调整日志输出量 自动输出日志相关信息,比如:日期.线程.方法名称等等

Java知识体系之基础知识

1. What is Java? Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 . 2. Who create it? 任职于Sun公司(Stanford University Network斯坦福网络公司)的詹姆斯·高斯林和麦克·舍林丹等人于1990年代初开发Java语言的

java继承形成程序体系

所以,一个体系要想被使用,直接查阅该系统中的父类的功能即可知道该体系的基本用法.那么想要使用一个体系时,需要建立对象.建议建立最子类对象,因为最子类不仅可以使用父类中的功能.还可以使用子类特有的一些功能. 简单说:对于一个继承体系的使用,查阅顶层父类中的内容,创建最底层子类的对象. 3:构造函数. 发现子类构造函数运行时,先运行了父类的构造函数.为什么呢? 原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super(); super(): 表示父类的构造函数,并会调用于参数相对应的父类

Java 继承之子父类中的成员变量和函数

成员变量: 先看这样一段代码: //父类. class Fu { int num = 3; } class Zi extends Fu { int num = 4; void show() { System.out.println("num = "+this.num); } } class ExtendsDemo { public static void main(String[] args) { Zi z = new Zi(); z.show(); } } 从一张图来看它的原理: 图

c++  与  java  中的 继承

C++ 代码: #include <iostream> #include <string> using namespace std; class Parent { public: void fun() {cout<<"Parent fun"<<endl;} void fun(int a) {cout<<"Parent fun int a"<<endl;} void fun(int a, int