如何在子包中扩展抽象类?接口与多抽象类场景实现疑问
解决子包中扩展抽象类的问题
咱们先梳理下你代码里的几个核心问题,一个个来解决:
1. 抽象类的访问权限问题
你现在的Class1是默认访问权限(没有public修饰符),这种权限下只有同一个包(com.p1)内的类才能访问它,子包com.p1.subPackage属于不同的包,所以哪怕你导入了也没法用。
解决办法:给Class1加上public修饰符,让它可以被其他包访问:
package com.p1; public abstract class Class1 implements InterfaceTest{ private int x; public Class1(int x){ } }
2. 子类构造函数必须调用父类构造函数
Class1只提供了带int参数的构造函数,Java中如果父类没有无参构造函数,子类必须在自己的构造函数里显式调用父类的构造函数,否则编译会报错。
修改Class2的构造函数,用super()调用父类的构造方法:
package com.p1.subPackage; import com.p1.Class1; public class Class2 extends Class1{ public Class2(){ super(5); // 调用父类的带参构造函数,传入初始化的x值 } }
3. 私有成员变量的访问问题
你原来的代码里直接写x = 5是不行的,因为x是Class1的private成员,子类无法直接访问。上面用super(5)的方式已经通过构造函数初始化了x,如果之后需要修改或访问x,建议在Class1里添加protected的getter/setter方法:
package com.p1; public abstract class Class1 implements InterfaceTest{ private int x; public Class1(int x){ this.x = x; // 别忘了给x赋值!你原来的构造函数没做这个 } // 提供protected的访问方法,让子类可以操作x protected int getX() { return x; } protected void setX(int x) { this.x = x; } }
这样在Class2里就可以通过getX()和setX()来操作x了:
public class Class2 extends Class1{ public Class2(){ super(5); // 之后如果需要修改x setX(10); } }
最后再检查下InterfaceTest,确保它也是public的,否则其他包的类也没法实现或继承它哦。
内容的提问来源于stack exchange,提问作者IhFisk
相关产品推荐
相关产品推荐

