请看代码:
Object obj1=session.getAttribute(USER_STRING);
SessionUser obj2=new SessionUser();
System.out.println("obj1's class:"+obj1.getClass());
System.out.println("obj2's class:"+obj2.getClass());
System.out.println("obj1:"+obj1);
System.out.println("obj2:"+obj2);
System.out.println("obj1:"+(obj1 instanceof SessionUser));
System.out.println("obj2:"+(obj2 instanceof SessionUser));运行结果:
obj1's class:class com.yisoft.yfc.session.SessionUserobj2's class:class com.yisoft.yfc.session.SessionUserobj1:com.yisoft.yfc.session.SessionUser@1dd58d8obj2:com.yisoft.yfc.session.SessionUser@1b3e93obj1:falseobj2:true
居然有这种事!!!!!!

解决方案 »

  1.   

    我判断的是类型啊!obj1和obj2是同一类型的两个对象,那为什么判断类型的时候一个false一个true呢?
      

  2.   

    Object obj1=session.getAttribute(USER_STRING);
    SessionUser obj2=new SessionUser();这是同一类型的两个对象吗?代码没问题啊,obj2确实是SessionUser()的实例啊,但obj1怎么是SessionUser()的实例。
      

  3.   

    instanceof是Java的一个二元操作符,和==,>,<是同一类东东。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:String s = "I AM an Object!";
    boolean isObject = s instanceof Object;我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向
    的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的
    值为True。因为Object是所有其他类型的基类,所以s instanceof Object=true,
    而楼主Object obj1=session.getAttribute(USER_STRING);
    obj1明明定义的是Object,所以obj1 instanceof SessionUser肯定是false
    向上转型是可以的,但是向下转型就不对了另外补充一下:
    getClass()也是java.lang.Object 类定义的方法,他返回某个对象的运行期类(runtime class)。
    所以尽管obj1.getClass()=SessionUser,但是obj1并不是SessionUser的实例,
      

  4.   

    那试问这段代码的输出:
    Object obj1=new SessionUser();
    SessionUser obj2=new SessionUser();
    System.out.println("obj1:"+(obj1 instanceof SessionUser));
    System.out.println("obj2:"+(obj2 instanceof SessionUser));
      

  5.   

    如果还是一样的,因为Object 和 SessionUser 还是不同的类,所以结果是一样的。
      

  6.   

    SessionUser obj1=(SessionUser )session.getAttribute(USER_STRING);
    改成这样就相同了
      

  7.   

    Object obj1=new ArrayList();
    ArrayList obj2=new ArrayList();
    System.out.println("obj1:"+(obj1 instanceof ArrayList));
    System.out.println("obj2:"+(obj2 instanceof ArrayList));你可以自己测试一下,上面的代码输出是:
    obj1:true
    obj2:true
      

  8.   

    to
     longlinhuang(龙麟) 
    难得你写这么多,可惜是错的,而且还说“肯定是false",你运行代码了吗?
    我本来不想回这个帖子了,因为楼主开了两个,但是没想到大家的基本功这么不扎实。
    请尝试运行下列代码:
            Object o = new ArrayList();
            System.out.println(o instanceof ArrayList);
    如果认为不准确在运行下列代码:
    <body bgcolor="#ffffff">
    <%
    session.setAttribute("name","aaa");
    Object o = session.getAttribute("name");
    out.print(o instanceof String);
    %>
    </body>
    我就说嘛,急着找工作没用的,因为在基本功不扎实的情况下很难在改正以前的错误认识。可能几年下去都是这样认为的了。
      

  9.   

    应该输出一样的,楼主检查看看session.setAttribute()的时候有没有问题
      

  10.   

    楼主对面向对象思想理解还是有待提高,,Object是通用对象,,你要把它进行强制转换才得到
    SessionUser对象
      

  11.   

    To  funcreal(为中华之崛起而编程) :
    你说我没运行代码,但是你运行代码了嘛?你只不过找了个类似的例子,并不能说明什么,楼主肯定是运行了代码的,他现在结果一false一true,如果你认为他结果错了,请分析原因,如果他结果没错,请给出为什么一false一true的原因,你的2个例子完全说明不了原因
    而且对你找的例子完全不敢苟同,
    Object o = new ArrayList();
    从这个得出 o instanceof ArrayList=true,
    但是楼主的例子里是这样的:Object obj1=session.getAttribute(USER_STRING);
    难道你 认为new SessionUser()等价于 session.getAttribute(USER_STRING),这么明显的错误居然还用来驳斥我的结论,我觉得真是不可思议
    至于为什么obj1.getClass()=SessionUser,我已经解释过了,getClass()得到的是对象的运行期类
    另外请楼主把SessionUser这个类贴出来看看,好像是楼主自定义的把
      

  12.   

    to longlinhuang(龙麟)
    首先如果我的话伤害了你,那么我郑重的道歉,对不起。
    我的观点是,楼主的问题是个奇怪的问题,应该输出两个true才对。而且我的代码我都运行过了。楼主的:
    Object obj1=session.getAttribute(USER_STRING);
    System.out.println("obj1:"+(obj1 instanceof SessionUser));我的:
    session.setAttribute("name","aaa");
    Object o = session.getAttribute("name");
    out.print(o instanceof String);
    我觉得我这段代码很能说明问题了吧。和楼主的没有区别。
    如果你认为out.print(o instanceof String)为false(从你的“obj1明明定义的是Object,所以obj1 instanceof SessionUser肯定是false”推断的),那么你是错的;如果你认为是true,
    那么我向你道歉,我理解错了,对不起!
      

  13.   

    TO funcreal(为中华之崛起而编程) 首先,你的代码我也运行过了.确实是True,这个我也承认,而楼主的代码由于我没有SessionUser这个类
    所以无法执行.我觉得问题的关键是 session.getAttribute(User_String)以及SessionUser这个类,对于你的例子是正确地那是勿庸置疑的,但是能不能用来代替楼主的问题,却是有一点疑问的,另外我的言语可能有点激动,并不针对任何人,大家都只是想解决问题而已,对于问题的都是好奇的最后我也向你道歉,楼主不知道还在不在,请务必来看看====CSDN 小助手 V2.0 2005年10月16日发布====
    CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
    界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/10/16/504620.aspx
    下载:http://szlawbook.com/csdnv2/csdnv2.rar为神六喝彩,向所有科技工作者致敬!
    拒绝日货。
      

  14.   

    谢谢各位在这个问题上的探讨,我认为在技术问题上发生争执是正常的,但是永远不要对一个观点太过自信。我始终认为我的代码应该输出的两个true。所以我怀疑我对instanceof的理解是不是有问题,它肯定是判断一个对象在执行期的具体类型这个没错,但是不是还有其他的考虑因素,如ClassLoader,我这个类是放在一个jar里面的。但应该是没有影响的。
    funcreal(为中华之崛起而编程) 给的测试代码我也运行了,结果是true。
      

  15.   

    to 
    dongdong715(美女追我八条街(抵制日货))
    虽然我不敢说我的面向对象的理解有多深,但你说的那点我还是清楚的,问题是你根本就没搞懂我提的那个问题。
      

  16.   

    我想问一下楼主,
    Object obj1=new SessionUser();
    SessionUser obj2=new SessionUser();
    System.out.println("obj1:"+(obj1 instanceof SessionUser));
    System.out.println("obj2:"+(obj2 instanceof SessionUser));
    以上代码的输出是什么,
    另外你的session类是com.yisoft.yfc.session,是自己写的嘛?如果是请把该类的原代码贴出来看看好吗
      

  17.   

    问题主要出在SessionUser这个类上,请楼主贴出代码以供分析
      

  18.   

    楼主,刚刚发现,你贴出的输出确实是正确的.longlinhuang(龙麟)写的以下代码完全是正确的
    String s = "I AM an Object!";
    boolean isObject = s instanceof Object;String是Object的实例,因为Object是万事万物的基类,但是楼主要证明的是:
    Object obj1=session.getAttribute(USER_STRING);
    System.out.println("obj1:"+(obj1 instanceof SessionUser));也就是说换成longlinhuang(龙麟)所说的就是:
    boolean isObject = Object instanceof SessionUser;Object会是SessionUser的实例吗?显然是错误的,大家好好想想吧,我一开始也差点吐血,呵呵,后来一看不对.
      

  19.   

    TO longlinhuang(龙麟) 
    Object obj1=new SessionUser();
    SessionUser obj2=new SessionUser();
    System.out.println("obj1:"+(obj1 instanceof SessionUser));
    System.out.println("obj2:"+(obj2 instanceof SessionUser));
    输出是两个true。
      

  20.   

    package com.yisoft.yfc.session;public class SessionUser {
        private Object userObject;
        public SessionUser() {
        }
        public Object getUserObject() {
            return userObject;
        }
        public void setUserObject(Object userObject) {
            this.userObject = userObject;
        }
        public boolean isLogin(){
            return !(userObject==null);
        }}
    package com.yisoft.yfc.session;import javax.servlet.http.HttpSession;public class SessionManager {
        private static String USER_STRING="user";
        public SessionManager() {
        }
        public static boolean isNewSession(HttpSession session){
            return session.getAttribute(USER_STRING)==null;
        }
        public static void createSession(HttpSession session){
            session.setAttribute(USER_STRING,new SessionUser());
        }
        public static void login(HttpSession session, Object userObject){
            SessionUser user=getUser(session);
            user.setUserObject(userObject);
        }
        public static void logout(HttpSession session){
            SessionUser user=getUser(session);
            user.setUserObject(null);
        }
        public static SessionUser getUser(HttpSession session){
            Object obj1=session.getAttribute(USER_STRING);
            SessionUser obj2=new SessionUser();
            System.out.println("obj1's class:"+obj1.getClass());
            System.out.println("obj2's class:"+obj2.getClass());
            System.out.println("obj1:"+obj1);
            System.out.println("obj2:"+obj2);
            System.out.println("obj1:"+(obj1 instanceof SessionUser));
            System.out.println("obj2:"+(obj2 instanceof SessionUser));
            return (SessionUser) obj1;
        }}
      

  21.   

    那只能看SessionUser以及session这两个类了.请把你的session类源代码贴出来可以嘛?
      

  22.   

    session是javax.servlet.http.HttpSession类的。
      

  23.   

    String s = "I AM an Object!"是产生了一个s的实例,但Object obj1=session.getAttribute(USER_STRING);obj1并没有产生SessionUser的实例,如果Object obj1=(SessionUser)session.getAttribute(USER_STRING),就该是true
      

  24.   

    本来以为楼主在session.getAttribute(USER_STRING)之前,session里面并没有SessionUser的实例绑定到USER_STRING下面,所以取出来的是null,然后判断类型的时候当然是false。
    但是发现getClass()方法能显示出来结果,说明的确是有这个实例存在的。我也试了一下
    <jsp:useBean class="com.mypackage.A" id="a" scope="session"/>
    <%
    Object o = request.getSession().getAttribute("a");
    response.getWriter();
    out.println(o.getClass());
    out.println(o instanceof com.mypackage.A);
    %>
    里面A是我自己写的一个空类。
    显示结果是class com.mypackage.A true
    跟楼主的程序大同小异,但是结果是true。
    关注中,希望明白人解答咯~