本帖最后由 wyshp 于 2014-05-29 11:57:15 编辑

解决方案 »

  1.   

    伪代码如上,想在子类B中输出父类P的成员变量data被更改后的值(即,hello),该如何改造。
    约束:A和B在实际中是分属于不同的业务类,所以不允许有继承关系有点不明白。
    在A类增加一个修改data的方法。public class A extends P {
         public static void main(){
              data = "hello";
         }
          
        public  setData(String data){
             this.data = data;
       }}
      

  2.   

    你这基础知识都模糊不清。。
    1.一个类的成员变量,是其对象所有,先要有对象,后才有那个成员变量,你在main函数里直接data=XXX是错误的,你要先创建对象,比如A a = new A();
    然后才能用a.data=XXX2.因为成员变量是对象所有,所以就算A,B都继承P,但是A,B的实例对象中的data不是同一个变量!!!
    就算是同一个类的两个对象,他们的data也是不同的两个变量!!!
    比如A a1 = new A();
    A a2 = new A();
    那么a1.data和a2.data完全是两个不同的变量,不是同一个东西!!!你这个要求完全违背面向对象的原则,也是没有好的解决办法的,因为你这个设计本身就有问题,如果需要在两个类中共享一个变量,那至少是在类之间传递这个变量,而不是像面向过程一样弄一堆全局变量!!
      

  3.   

    嗯,你这样是能修改的,但是在B里边取data的值始终都是null。因为this是当前类。
    简单点说就是:在子类A中修改了父类的属性值,想达到在子类B中取到父类这个属性的最新值。
      

  4.   

    使用单例模式获得唯一实例不就可以保证数据是唯一的?例如Runtime.getRuntime()就是这样。
      

  5.   

    伪代码也要逻辑清晰吧。。伪代码是不局限于某种语言,不是你可以随意省略必要步骤
    你在main函数中访问data,别人一看怎么知道data是什么,如果是局部变量,你又没有申明这个局部变量,如果是对象的成员变量,你又没有创建对象你是学C这种面相过程的语言学多了,还是根本没理解面向对象的概念啊。。
    你的需求用static变量能做到,但终究就是十分烂的设计,因为这根本不是面相对象,完全有违面向对象的原则
      

  6.   

    直接在基类里就把data赋值成Hello行不?
      

  7.   

    综合各位看官的说法,解决这个问题的方法有两种:
    1、单例模式,class P这个类保留构造器,仅提供get实例的方法;
    2、将要共享的变量声明为static。
    如果要共享同一数据,只有让其在内存中存在唯一一份,或者多份之间同步。上述两种方法都保证了数据在内存中仅存在一份。
      

  8.   

    如果你一定需要这么别扭的实现。。那么看这个例子
    public class ClassTest {
    public static void main(String[] args) {
    new A();
    new B();
    }
    }
    abstract class P {
    protected static String data;
    }class A extends P {
    A() {
    P.data = "Hello";
    }
    }
    class B extends P {
    B() {
    System.out.println(P.data);
    }
    }