關於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM