如何在Java的不同Package中访问子类?
嘿,我来帮你梳理清楚怎么在不同包下访问另一个包中类的内部子类~
首先得明确两个关键前提,不然跨包访问根本无从谈起:
- 包含内部子类的外部类(也就是你说的Package1里的
Mainclass)必须是public修饰的,不然跨包连外部类都找不到; - 内部子类(
SubClass)不能是private修饰,至少得是protected或者public,这样跨包才有访问权限。
接下来分两种常见的内部类情况来具体说明:
1. 当SubClass是成员内部类(非静态)
成员内部类是依赖外部类实例存在的,所以得先创建外部类的对象,再通过它来实例化内部类:
先看Package1的代码示例:
package package1; // 外部类必须是public public class Mainclass { // 内部子类用public/protected修饰,允许跨包访问 public class SubClass { public void testMethod() { System.out.println("我是Package1里的SubClass方法"); } } }
然后是Package2的访问代码:
package package2; // 导入Package1的外部类 import package1.Mainclass; public class TestAccess { public static void main(String[] args) { // 第一步:创建外部类实例 Mainclass mainObj = new Mainclass(); // 第二步:通过外部类实例创建内部子类实例 Mainclass.SubClass subObj = mainObj.new SubClass(); // 调用内部子类的方法 subObj.testMethod(); } }
2. 当SubClass是静态内部类
静态内部类不依赖外部类实例,直接通过外部类的类名就能访问,步骤更简单:
Package1的代码示例:
package package1; public class Mainclass { // 静态内部子类,同样用public/protected修饰 public static class SubClass { public void testMethod() { System.out.println("我是Package1里的静态SubClass方法"); } } }
Package2的访问代码:
package package2; // 可以直接导入外部类,或者直接导入内部子类 import package1.Mainclass; // 也可以写成:import package1.Mainclass.SubClass; public class TestAccess { public static void main(String[] args) { // 直接通过外部类名创建静态内部类实例 Mainclass.SubClass subObj = new Mainclass.SubClass(); // 如果直接导入了内部子类,就可以简化成:SubClass subObj = new SubClass(); subObj.testMethod(); } }
额外注意点
- 如果
SubClass是protected修饰的,那Package2的类必须继承Package1的Mainclass,才能访问这个内部子类; - 要是内部子类是默认访问权限(没有写修饰符),那只有同包才能访问,跨包是不行的哦。
内容的提问来源于stack exchange,提问作者M. Fitriawan
相关产品推荐
相关产品推荐

