Java中能否跨类使用类元素/方法?同包类Foo与Bar图形对象访问问题
Java类间访问权限相关问题解答
嘿,这两个问题都是Java类设计里的基础但核心的点,我来给你梳理清楚:
问题1:在Java中,是否可以在一个类中使用另一个类的元素或方法?
当然可以,但能不能访问到取决于两个关键因素:成员的访问修饰符和类的可见性,具体规则如下:
- public修饰的成员:不管两个类在哪个包、有没有继承关系,只要能访问到类本身,就能直接访问它的public成员;
- protected修饰的成员:仅限同包下的类,或者该类的子类(哪怕子类在不同包)可以访问;
- 默认修饰符(无关键字):只有同包下的类能访问;
- private修饰的成员:只能在当前类内部访问,外部类哪怕是同包也碰不到(除非用反射,但这属于非常规操作,不推荐在业务代码里用)。
另外还要区分静态成员和实例成员:
- 静态成员(带
static关键字):直接通过类名.成员名就能访问,不需要创建类的实例; - 实例成员:必须先创建类的对象(比如
Foo foo = new Foo();),再通过对象.成员名来访问。
问题2:同包下Bar能否访问Foo构造里的AWT图形形状对象?
按照你给出的代码,目前是完全访问不到的,原因很简单:你在Foo构造函数里创建的AWT图形对象是局部变量,它的作用域只限于Foo的构造函数内部,出了这个构造函数,外部(包括同包的Bar类)根本不知道这个变量的存在。
如果想让Bar类能访问到这个图形对象,你需要做两个调整:
- 把这个图形对象从构造函数的局部变量,改成Foo类的成员变量;
- 给这个成员变量设置合适的访问修饰符(比如public、默认修饰符,具体看你的权限需求)。
举个修改后的例子:
修改后的Foo类
import java.awt.Shape; import java.awt.Rectangle; public class Foo { // 把图形对象定义为成员变量,这里用默认修饰符(同包可访问)为例 Shape awtShape; public Foo() { // 在构造函数里初始化这个成员变量 awtShape = new Rectangle(10, 10, 50, 50); // 创建一个矩形示例 } }
修改后的Bar类
import java.awt.Shape; public class Bar { public Bar() { // 先创建Foo的实例 Foo fooInstance = new Foo(); // 现在就能访问Foo里的awtShape对象了 Shape shapeFromFoo = fooInstance.awtShape; // 后续可以对这个shape做操作 } }
这样调整后,同包下的Bar类就能正常访问Foo里的AWT图形对象了。
内容的提问来源于stack exchange,提问作者Jerry Xu
相关产品推荐
相关产品推荐

