抽象类继承与普通可实现父类继承的差异及字段访问问题
继承抽象类与普通父类的差异,以及private字段访问问题
嘿,这两个问题其实是面向对象继承体系里的基础但容易踩坑的点,我给你掰扯清楚~
一、继承抽象类和普通可实例化父类的核心差异
- 实例化限制:抽象类(比如你的
abstractcar)根本没法直接new出对象,它从设计之初就是用来被子类继承的;而普通可实例化父类可以直接创建实例,本身就是一个完整的对象模板。 - 强制行为约束:如果抽象类里定义了抽象方法(就是那种只有方法签名、没有方法体的方法),所有非抽象的子类必须老老实实实现这些方法;普通父类就没这要求,子类爱重写就重写,不重写也没关系。
- 设计定位不同:抽象类更像一个行为规范模板,用来统一子类的行为标准,强调的是"属于同一类别必须遵守的规则";普通父类则更偏向于代码复用,把多个子类的通用逻辑抽离出来,减少重复代码。
- 成员组成区别:抽象类可以同时混着抽象方法、普通方法、字段;普通类只能有普通方法和字段(Java 8之后普通类能加默认方法,但本质还是普通方法的扩展,和抽象方法不是一回事)。
二、关于capacity字段访问报错的问题
你碰到的"capacity has private access in abstractcar"错误,核心是private成员的访问权限规则在搞事情:
- 子类确实会继承父类的private字段,但这些字段对子类来说是"隐身"的——也就是说,子类没法直接通过
capacity这种方式调用,只能在父类自己的代码里用。 - 你之前的认知有个小误区:子类继承父类的所有成员,但访问权限会限制你能不能直接用它们。
解决方法(推荐遵循封装原则)
给抽象类abstractcar加个getter(要读的时候用)和setter(要改的时候用)方法就行,比如:
public abstract class AbstractCar { private int capacity; // 让子类能读取容量的getter方法,用protected修饰只给子类和同包类用 protected int getCapacity() { return capacity; } // 让子类能设置容量的setter方法 protected void setCapacity(int capacity) { this.capacity = capacity; } // 其他抽象方法或普通方法... }
然后在SmallCar的构造方法里,通过这些方法来操作capacity:
public class SmallCar extends AbstractCar { public SmallCar() { // 读取容量值 int currentCap = getCapacity(); // 设置新的容量 setCapacity(4); } }
要是你确实需要子类直接访问这个字段,也可以把capacity的修饰符改成protected——不过这种方式会破坏封装性,除非有特别必要,否则还是用getter/setter更规范。
内容的提问来源于stack exchange,提问作者youknownothingjonsnow
相关产品推荐
相关产品推荐

