// TestSuperObject.java
public class TestSuperObject 
{        private String name;
        
        public String getName()
        {
                return name;
        }
        
        public void setName(String name)
        {
                this.name = name;
        }                public String toString()
        {
                return ("name=" + getName());
        }
}
// TestSubObject.java
public class TestSubObject extends TestSuperObject
{
        
        private String alias;
        
        public String getAlias()
        {
                return alias;
        }
        
        public void setAlias(String alias)
        {
                this.alias = alias;
        }        public String toString()
        {
                return ("alias=" + getAlias());
        }                
}// TestSuperClass.java
public class TestSuperClass 
{        protected TestSuperObject orignObject;
        
        public TestSuperObject getObject()
        {
                return this.orignObject;
        }
        
        public void setObject(TestSuperObject object)
        {
                this.orignObject = object;
        }
        
        public void release()
        {
                if (getObject() != null)
                {
                        setObject(null);
                }
        }
}// TestSubClass.java
public class TestSubClass extends TestSuperClass 
{
        
        private TestSubObject orignObject;
        
        public TestSuperObject getObject()
        {
                return this.orignObject;
        }
        
        public void setObject(TestSubObject object)
        {
                this.orignObject = object;
        }
}// TestInheritance.java
public class TestInheritance
{
        
        public static void main(String[] argv)
        {
                TestInheritance instance = new TestInheritance();
                instance.testSuperClass();
                instance.testSubClass();
        }
        
        public void testSuperClass()
        {
                System.out.println("----- test case 1 begin------" );
                TestSuperClass test = new TestSubClass();
                TestSubObject object = new TestSubObject();
                object.setAlias("sub object" );
                test.setObject(object);
                
                System.out.println(test.getObject());
                test.release();
                System.out.println(test.getObject());                
                System.out.println("----- test case 1 end------" );
                System.out.println();
        }        public void testSubClass()
        {
                System.out.println("----- test case 2 begin------" );
                TestSubClass test = new TestSubClass();
                TestSubObject object = new TestSubObject();
                object.setAlias("sub object" );
                test.setObject(object);
                
                System.out.println(test.getObject());
                test.release();
                System.out.println(test.getObject());                
                System.out.println("----- test case 2 end------" );
                System.out.println();
        }
}

解决方案 »

  1.   

    环境:JDK1.4, JDK1.5得到的输出如下:
    ----- test case 1 begin------
    null
    null
    ----- test case 1 end----------- test case 2 begin------
    alias=sub object
    alias=sub object
    ----- test case 2 end------  
      

  2.   

    测试1和测试2唯一不同的地方在:
    测试1:
    TestSuperClass test = new TestSubClass();测试2:
    TestSubClass test = new TestSubClass2();但在测试1中的test.setObject(object),调用的是父类的方法(? Q1),同时给父类的类变量orignObject赋值,可接下来在父类中release()中调用的getObject()却是子类的方法(? Q2),因为是子类的类变量是空,所以返回了,没有任何输出而在测试2中的test.setObject(object),调用的是子类的方法(? Q3),同时给子类的类变量赋值,接下来在父类中的release()中调用的getObject()却是子类的方法(? Q4),而接着访问的setObject()却是父类中的方法(? Q5),导致无法将子类中的类变量置为null,也就意味着release()没有实际起到作用,所以接下在子类中的getObject()还可以继续得到子类变量orignObject  
      

  3.   

    to treeroot(旗鲁特)
    请再看看仅仅是方法重载的问题吗?
      

  4.   

    to kevinliuu(@。@) ,是啊,确实有点。不过也可以大致这样理解:
    有A,B两个类(可以看作是model吧),A继承自B,另外有X,Y两个类(可以看作是service implementation),X继承自Y。在X中会使用A(有一些具体的业务方法),在Y中会使用B(也是具体的业务方法)。
    A,B这两个实例需要分别在X,Y中释放,而现在的释放都是通过父类Y中的release()方法。
      

  5.   

    public void setObject(TestSuperObject object)
    public void setObject(TestSubObject object)
    楼主认为这还是继承么?