18/09/2021 继承与封装
语法
关键字:extend
public class 子类名 extends 父类名 {}
public class B extends A {}
B的对象有两重身份,首先是B类型,其次也是A类型。但对于父类A,不能调用子类B独有的属性和方法。
接口、类和抽象类
接口
接口的属性由字段和方法组成,没有构造函数,因为接口是用来被子类继承进而实现多态性的,所以不能被实例化。
接口只能被public,static以及final修饰
类
类的属性主要由字段、方法、构造函数、代码块和静态代码块组成
抽象类
抽象类的属性主要由字段、方法、构造函数、代码块和静态代码块组成,所以大致和类的定义规则是一样的。不同之处在于抽象类的方法允许定义抽象方法。
三者关系
类和抽象类均可以实现多个接口,同时抽象类不必实现全部的接口方法(适用于模块化设计)
类只能继承一个抽象类
接口可以继承多个接口,用逗号隔开,接口实现类必须实现所有接口的方法,接口与接口的关系解决了类的单继承问题
访问修饰符 – 权限范围
public – 整个项目源码包中
private – 当前类中
protected – 同包中以及不同包的子类中
缺省 – 同包中
继承范围
子类可以继承父类的所有属性和方法
子类以及子类对象可以直接调用继承到的哪些属性与方法取决于访问修饰符
同包
只有私有(private)属性和方法不能直接调用
不同包
与父类不同包的子类中,可以调用public和protected
与父类不同包的非子类中,只能调用public
方法重写
重写注解:@Override 检测方法重写是否正确
子类可以重写父类的方法,一般情况下要求子类中重写的方法结构体(除方法体之外的内容,例如访问权限修饰符,返回值类型,方法名(参数类型 参数变量名))与父类一致。重写后,子类以及子类的对象会优先调用重写后的方法,而不是继承到的方法。方法重写是基于父类的方法,进行进一步的扩展实现。
**重载:在同一类中,可以写多个同名的方法,要求这些方法的参数不一致。在对方法进行调用时,由参数决定调用哪一个。同时重载的方法的返回值可以不一致。
方法重写的结构
访问修饰符要与父类同级或者更大范围,public > protected > 缺省 > private。同时,重写的返回值数据类型要与父类一致,或者是父类方法返回值类型的子类。方法名和参数均不能修改。
自动转型与强制转型
强制转型
int i = (int)1.2; //该例子为强制转型,将1。2转型为1,此方法有风险
因为1 byte = 8 bits
,所以byte取值范围为-128~127。
int i = 128;
byte b = (byte)i; //该例子转型采用轮回制,最终结果将128转型为-128
强制转型是需要注意所转的类型是不是对象原本的类型,仅可以先由子类对象转为父类类型变量,再强制回同子类类型。
自动转型
格式:A a = new B()
。该语句成立的前提是A是B的父类。
子类对象可以自动转型为父类类型,一个子类对象的变量存储的对象引用地址,也可以存在父类类型的变量名中。
封装
封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
封装提供了一个有效的途径保护或者防止数据被破坏。
封装要求所有相关属性都定义为私有(private)。
构造器和get&set方法的代码实现
public class Student {
private String name;
private String gender;
private int studentId;
//构造方法:以类名为方法名,没有返回值结构
//每个类都有一个隐式的空参数构造方法,但是只要在类中定义了构造方法,就会被覆盖
//在创建对象的时候可以对全部属性进行初始化
public Student(String name, String gender, int studentId) {
this.name = name;
this.gender = gender;
this.studentId = studentId;
}
//get方法获取对象属性,set方法对属性赋值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
}