类的继承
继承的概念
继承就是子类继承父类的属性和方法,使得子类对象可以拥有使用父类的属性和方法。
子类是父类的一个更具体更细化的实体,拥有父类特征和方法也可以拥有子类自己的特征和方法。
例:父类为动物,子类为狗(狗拥有哺乳动物的一些行为和特性但是也有自己的特性和行为)
继承的一个作用是减少代码量,可以将两段代码相同的地方提取出来组成一个父类,减少代码冗余,提升后期代码维护的效率。
继承的格式
class 父类{
}
class 子类 extends 父类 {
}
注意这里的extends是单继承,即一个子类只能继承一个父类,不可以继承多个父类,但是可以多层次继承(比如子类1 extends 父类,子类2extends子类1).
implement 实现的是接口继承,接口支持多接口继承,继承接口的时要实现接口内的所有方法
继承访问命令符
子类继承父类是,访问命令符的范围只能比父类的更大
(访问命令符的范围从大到小为public,protected,default,private)
方法的重写
有时子类会在父类的某一个方法的基础上实现自己的行为,此时需要进行对父类方法的重写,重写方法时方法名,传入参数,返回参数等和父类的方法一致,方法体可以修改。
如果想在父类的基础上进行添加则可以在子类方法体中运用super关键字+方法名,则会先执行父类的方法体后执行子类的方法体。this关键字指向子类自己重写后的方法。
注意如果父类方法被final修饰则不可以在子类中重写。
继承实例
(1) 子类继承父类属性和方法
定义了父类animal和子类dog,父类animal有私有属性name和公有属性age,方法为共有run,getname和setname, 私有方法fly. 子类dog的方法为dog子类的printname和重写父类的方法run。
创建新的实体dog d= new dog.
可以看见dog拥有父类的公有属性age和公有方法run,getname,setname但是没有私有属性name和私有方法fly。
如果想调用父类中的私有属性和方法可以通过set和get方法来实现。
(2)子类方法的重写与调用,子类方法在父类方法基础上增加功能
如果不重写子类中的run方法,调用d的printname方法和run方法,可以看到调用的是父类中的run方法
如果子类中重写了run方法,则会调用子类中重写的run方法
如果在子类dog中用了super关键字则先调用的是父类中的run方法,然后再继续执行子类重写方法的功能。
(3)父类方法被final修饰不可被重写
如果父类中的方法被final修饰,则子类不可以重写该方法
(4)父类方法被重写时子类修饰符只可以比父类的范围大
如果父类run方法访问修饰符为public,子类run方法访问修饰符为protected则会报错,因为public的范围比protected大。
接口
接口的概念
接口是抽象方法的集合,里面写的都是抽象方法,接口内的方法不能有方法体,接口以interface来声明。
接口不可实例化对象。
接口内可以定义常量,写在接口内的常量用public static finall来修饰,表示静态常量。
一个类通过继承接口的方式,从而来继承接口的抽象方法,一个类如果继承了一个接口,需要将接口内的抽象方法全部重写。一个接口可以有多个方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
接口的格式
public interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
接口的继承:用implements来继承接口,接口支持多继承。一个接口只能继承另一个接口,接口之间的继承用extends来实现。
例:University,Teacher为两个接口,Teacher可以继承University这个接口。
public interface University{
//抽象方法一
}
例:public interface Teacher extends University{
//抽象方法二
}
如果有一个Student类继承了Teacher的接口,那么在学生类里面要重写Teacher和University两个接口的所有方法,因为Teacher继承了University这个接口。
例:public class Student implements Teacher{
//抽象方法一
//抽象方法二
}