伪代码如上,想在子类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; }}
你这基础知识都模糊不清。。 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完全是两个不同的变量,不是同一个东西!!!你这个要求完全违背面向对象的原则,也是没有好的解决办法的,因为你这个设计本身就有问题,如果需要在两个类中共享一个变量,那至少是在类之间传递这个变量,而不是像面向过程一样弄一堆全局变量!!
如果你一定需要这么别扭的实现。。那么看这个例子 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); } }
约束:A和B在实际中是分属于不同的业务类,所以不允许有继承关系有点不明白。
在A类增加一个修改data的方法。public class A extends P {
public static void main(){
data = "hello";
}
public setData(String data){
this.data = data;
}}
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完全是两个不同的变量,不是同一个东西!!!你这个要求完全违背面向对象的原则,也是没有好的解决办法的,因为你这个设计本身就有问题,如果需要在两个类中共享一个变量,那至少是在类之间传递这个变量,而不是像面向过程一样弄一堆全局变量!!
简单点说就是:在子类A中修改了父类的属性值,想达到在子类B中取到父类这个属性的最新值。
你在main函数中访问data,别人一看怎么知道data是什么,如果是局部变量,你又没有申明这个局部变量,如果是对象的成员变量,你又没有创建对象你是学C这种面相过程的语言学多了,还是根本没理解面向对象的概念啊。。
你的需求用static变量能做到,但终究就是十分烂的设计,因为这根本不是面相对象,完全有违面向对象的原则
1、单例模式,class P这个类保留构造器,仅提供get实例的方法;
2、将要共享的变量声明为static。
如果要共享同一数据,只有让其在内存中存在唯一一份,或者多份之间同步。上述两种方法都保证了数据在内存中仅存在一份。
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);
}
}