Java同包不同类文件间如何访问变量?还有哪些其他实现方式?
首先,先给你说最简单的实现方式:你的Sender类里的val是静态变量,它属于类本身而不是某个实例,所以完全不需要用继承来访问!直接在Receiver里通过Sender.val就能拿到这个变量,这比继承更合理——毕竟继承是用来表达"is-a"的类关系,而你只是要访问一个静态变量,用继承反而会让代码语义混乱。
修改后的Receiver.java代码如下:
class Receiver{ public void show(){ System.out.println("Receiver value=" + Sender.val); } }
运行你的Main类,就能得到和继承方案一样的效果,而且代码逻辑更清晰。
接下来给你列举其他几种可行的实现方式,适用于不同场景:
1. 构造方法传入Sender实例(适用于非静态变量)
如果你的val不是静态变量,而是每个Sender实例独有的成员变量,那可以在创建Receiver的时候,把Sender对象传进去保存为成员变量,之后就能访问它的val了。
先修改Sender.java把val改成非静态:
class Sender{ int val=0; // 去掉static关键字 public void show(){ System.out.println("Sender value="+val); val++; } }
然后修改Receiver.java:
class Receiver{ private Sender senderInstance; // 通过构造方法接收Sender对象 public Receiver(Sender sender){ this.senderInstance = sender; } public void show(){ System.out.println("Receiver value=" + senderInstance.val); } }
最后在Main.java里创建Receiver时传入sender实例:
class Main{ public static void main(String args[]){ Sender sender=new Sender(); Receiver receiver=new Receiver(sender); // 传入sender对象 sender.show(); receiver.show(); } }
2. 提供Getter方法(更符合封装原则)
为了遵循面向对象的封装性,不建议直接访问类的成员变量,最好给Sender添加一个Getter方法,不管val是静态还是非静态都适用。
比如给Sender添加Getter:
class Sender{ static int val=0; public void show(){ System.out.println("Sender value="+val); val++; } // 静态Getter方法对应静态变量 public static int getVal(){ return val; } }
然后Receiver里通过Getter访问:
class Receiver{ public void show(){ System.out.println("Receiver value=" + Sender.getVal()); } }
这种方式的好处是,以后如果val的内部实现逻辑变了(比如加了计算逻辑),只需要修改getVal()方法,Receiver的代码完全不用动,耦合度更低。
为什么不推荐用继承?
你之前用继承实现的方式虽然能跑通,但其实是滥用继承:继承的核心是表达类之间的"是一个"关系(比如Dog extends Animal),而Receiver和Sender显然不是这种关系。用继承会让两个类的耦合度变高,以后Sender的任何修改(比如添加新的方法、修改父类逻辑)都可能影响到Receiver,不利于代码维护。
内容的提问来源于stack exchange,提问作者Suraj Jeswara

