JAVA基础 - 继承
继承,即按照现有类的类型来创建新类,是复用的实现方式之一。
继承类可以访问基类的protected成员,但不能访问private成员。
一个例子就可以说明。
基类:
@Data public class BaseModel { protected String testField; }
i继承类:
@Data public class ExtendModel extends BaseModel { private String selfField; @Override //BaseModel使用protected public String toString() { return "ExtendModel{" + "testField='" + testField + '\'' + ", selfField='" + selfField + '\'' + '}'; } // @Override BaseModel使用private // public String toString() { // return "ExtendModel{" + // "testField='" + super.getTestField() + '\'' + // ", selfField='" + selfField + '\'' + // '}'; // } }
测试:
public class ExtendTest {
public static void main(String[] args) {
ExtendModel e = new ExtendModel();
// e.setTestField("test");
e.testField = "test";
e.setSelfField("self");
System.out.println(e);
}
}
输出结果:ExtendModel{testField='test', selfField='self'} -----> 默认继承类的toString方法不包含基类字段
对继承类来讲,对象既可以作为自己本身的类型使用,也可以作为它的基类类型使用,即向上转型。基类可以接受发送给导出类的任何消息,因为二者有着完全相同的接口,从导出类向上转型,不需要知道正在处理的对象的确切类型。
向上转型是安全的,而向下转型则因为导出类拥有基类不具有的接口则无法保证安全性。解决方法之一就是在转型的时候通过加括弧形式进行类型转换,但是依然不能保证一定能成功,因为java会对所有的转型进行检查(运行时类型识别,RTTI)。如果不是能够转型的类型,则会报类转型异常(ClassCastException)。
BaseModel b = e;
ExtendModel e2 = (ExtendModel) b;