讲师,助教,都属于教师,讲师和助教共有的信息抽取出来作为教师父类。讲师类,助教类继承教师类,作为子类。
(2)编码实现
(1)子类可以拥有父类非private的属性和方法(2)子类可以拥有自己的属性和方法,即子类可以对父类进行扩展(3)子类可以用自己的方式实现父类的方法(重写Override)。(4)Java的继承是单继承,但是可以多重继承。这是Java继承区别于C++继承的一个特性。(5)提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
(1)extends关键字
在Java中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以extends只能继承一个类。java.lang.Object类是所有类的最高公共父类,一个类没有继承的关键字,则默认继承Object类
publicclassPerson{Stringname;Stringsex;publicvoideat(){}publicvoidsleep(){}}publicclassStudentextendsPerson{ //即使子类不编写代码,也会用拥有父类所有非private的属性和方法}(2)implements关键字
使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
publicinterfaceA{publicvoidaa();publicvoidbb();}publicinterfaceB{publicvoidaa();}publicclassCimplementsA,B{}(3)super关键字
通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
classA{inta;publicvoida(){}}classBextendsA{inta;publicvoida(){}publicvoidtest(){this.a=11;//调用自己的成员变量super.a=22;//调用父类的成员变量this.a();//调用自己的成员方法super.a();//调用父类的成员方法}}(4)final关键字
finalclass类名{}final关键字修饰方法,该方法不能被子类重写.
权限修饰符final返回值类型方法名(){}4.重写(override)重写:override(覆盖、覆写)
在继承中,子类与父类的方法名称一样,参数列表也一样,但是方法体不同,称为方法的重写。
classFu{publicvoidmethod(){ System.out.println("这是父类方法");}}publicclassZiextendsFu{//Override注解可以检测重写方法是否符合规范,可以不写但是不推荐@Overridepublicvoidmethod(){ System.out.println("这是子类方法");}}5.构造方法1.子类构造方法中默认带有super()调用父类构造方法,所以一定要先调用父类构造方法,后执行子类构造方法2.可以通过super关键字在子类调用父类的重载构造3.父类构造方法的调用必须是子类构造方法的第一条语句,一个子类构造方法只能调用一个父类构造方法4.只有子类构造方法才能调用父类构造方法
classConstructorTest{publicstaticvoidmain(String[]args){Ziz=newZi();}}//运行结果为:父类无参构造方法父类有参构造方法子类构造方法父类、子类的代码↓↓↓
classFu{publicFu(){System.out.println("父类无参构造方法");}publicFu(intnum){ this();//使用this关键字调用其它构造方法System.out.println("父类有参构造方法");}classZiextendsFu{publicZi(){//super();可以不写,编译器默认包含,如果调用了其它构造方法,则默认super()失效super(20);System.out.println("子类构造方法");}}【注意】
1.子类构造方法必须继承一个父类构造方法2.出现了继承关系,编译器默认继承父类构造方法3.子类默认构造方法和子类中的super()都为隐式(可以不使用super关键字调用)4.如果要调用父类其它构造方法则必须使用super关键字调用5.如果想调用两个父类构造方法,则必须在父类另外一个构造方法中,使用this关键字调用其它构造方法
//定义父子类classFu{intnumFu=10;intnum=100;//这是父子类重名变量}classZiextendsFu{intnumZi=10;//这是父子类重名变量intnum=200;}知识点在注释
publicclassFieldTest{publicstaticvoidmain(String[]args){ //首先对子类父类创建对象,以供下文比较Fuf=newFu();//父类对象Ziz=newZi();//子类对象//使用子类对象和父类对象,都可以输出父类的numFuSystem.out.println(f.numFu);System.out.println(z.numFu);//但是只能使用子类对象输出numZiSystem.out.println(z.numZi); //如果父子类存在同名变量时 //等号左侧是哪个类,就会使用哪个类的成员变量, //如果找不到继续向上(父类)寻找 System.out.println(f.num);//输出父类num System.out.println(z.num);//输出子类num//父类不会知道谁继承了它,但是子类一定知道继承了谁 }}7.父子类间成员方法的访问子类方法的访问权限必须大于等于父类方法的权限修饰符子类方法的返回值类型必须小于等于父类方法的返回值类型
classFu{publicvoidmethodFu(){System.out.println("这是父类方法");}//这是父子类重名方法 Objectmethod(){ System.out.println("这是父类重名方法"); returnnull; }}classZiextendsFu{publicvoidmethodZi(){System.out.println("这是子类方法");}//这是父子类重名方法@Override publicStringmethod(){ //子类的访问权限(public)大于父类的访问权限(default) //子类的返回值类型(String)小于父类的返回值类型(Object) Stringstr="这是子类重名方法"; returnnull; }}