首页 > 代码库 > Java继承
Java继承
Java继承
1.什么是继承呢?
类似人类中的继承(继承上一辈、上上辈的东西),在Java中就是将一个已知的类进行拓展,让一个新的类来继承这个已知的类,这样就能使这个新的类具有已知类的属性和行为。
新的这个类被称为子类或者派生类,已知的类被称为父类或者基类、超类。
2.为什么使用继承呢?
将一个类作为父类这样可以使其代码进行重用,在子类中就可以不再需要写父类中已有的属性或者行为了
3.那在Java中如何实现继承呢?
(1)先判断是否这些类中存在继承的关系——"is a"?
什么是"is a"关系呢?
简单的说就是是否两个或多个类中存在父类与子类,而平时进行比较时多将is a说成是一个,
(2)判断哪些属性和行为是子类与父类中重复的,可以重用的——"has a"?
什么是"has a"关系呢?
这一个可以简单的去思考与观察,如何发现子类与父类中有重复的属性或者行为,则该属性或者行为与该类是"has a"关系,"has a"关系的属性和行为都应该只写在父类。
(3)创建父类
在创建父类时和之前创建普通的类是一样的,关键在于需要将"has a"关系的属性或者行为写在父类中。
(4)创建子类
在创建子类时和之前的都差不多,关键在于多一个extends关键字
创建子类继承时需要写为public class Salary extends Employee
(5)如何书写子类的内容
①若子类中出现了父类中没有的属性或者行为,则直接在子类中添加即可
②若子类中需要改变父类中原有的行为——实现的方式有所不同,这时需要使用方法重写来完成不同的实现操作
方法重写
什么是方法重写呢?
刚刚其实已经说到了,当父类与子类之间需要将相同的行为拥有不同的实现时,就需要使用重写。
重写的好处——为什么Java中有方法重写呢?
可以按照自己的意愿去更改父类的方法实现。
一般情况下我们会以继承与重写一起说它们的好处
好处:继承可以使一个类中的代码得到重用,而重写在继承的基础上又可以使子类对父类已有的方法进行重新的实现。
重写有一些注意事项:
①在重写父类的行为时,需要使子类的方法的返回类型、方法名、形式参数列表与父类一致,若仅仅只是方法名相同,参数列表不同则变成了方法的重载。
②访问修饰符的访问等级不能小于父类(将在下一章中进行讲解)
③子类抛出的异常不能比父类多(在下一册中进行讲解)
3.那在Java中如何实现继承呢?
☆(6)实例化子对象
如何实例化一个子对象呢?
和平时实例化对象一样。
注意:子类可以调用父类中的方法和属性,但是父类则不能调用子类中独有的属性或行为。
在内存中创建一个对象时,究竟发生了什么呢?
首先创建了一个父类
再创建一个子类
创建子类的过程实际上时在父类的基础上再加上了子类附加的内容
顺便提一句:
Java是单继承语言,也就是说一个父类可以有很多子类,而一个子类只能最多拥有一个父类
除了单继承语言外,还有多继承语言如C++,继承关系就相当的混乱
根据父类的内容来判断是否能进行某些方法的调用
注意事项:在Java中所有的类都具有一个父类(根类)——object类
object可以是一个类的直接父类,也可以是一个类的间接父类,关键看该类是否继承了其它类
由于Java中object是所有类的父类,因此,所有类都可以调用object类的方法
- public final Class getClass();
- public int hashCode();
- public boolean equals(Object x);
- protected Object clone() throws CloneNotSupportedException;
- public String toString();
- protected void finalize() throws Throwable;
- public final void wait() throws InterruptedException;
- public final void notify();
注意:Java中object有一个常用的方法toString(),可以将引用转为字符串打印,如果没有调用该方法直接打印引用,Java会自动调用该方法,打印出其地址。
除了object中的toString()方法,常用的还有equals()方法,该方法用于判断是否两个值相等和==的用处不一样
==用于检测是否两个引用指向同一对象,才能返回true
equals()则只需要匹配值就返回true,若需要更改则重写equals()方法
在重写equals()方法时会自动添加一个hashCode()方法,该方法是计算equals()中比较值的哈希码(了解),若两个对象是相等的,则哈希码相同
如果把父类某个方法全部重写,只需要部分修改,那怎么书写呢?
这个时候我们需要使用super关键字,这个关键字和我们之前讲的this关键字很类似,只不过super关键字代码父类对象,而this代表的是本类对象。
在子类中也可以调用父类的构造器super(),如果在父类中没有无参的构造,这种情况下子类中super()不会通过编译。
如果我不想一个类被继承或者一个类中某个行为被继承,那怎么做到呢?
使用final关键字,之前学习中,使用final关键字构建的符号常量不能被更改
同理,在类或者方法中使用final关键字则该类或者改方法不能被更改——换言之则是不能被继承或者重写。
在实例化子类对象时其过程究竟是什么样子的?
注意事项:当一个子类被实例化时,父类会先被构造,父类构造器必须在子类的构造器执行前执行,若出现祖父类,则从祖父类构造→父类构造→子类构造。
在一个对象被实例化时,发生下列事件序列:
①new运算符调用子类的构造器。
②子类会用this关键字调用子类的其它构造器,最后在执行this之后的语句。
③在子类的构造器中的任何语句执行前,父类的构造器必须用super()关键字调用,如果没有显示的调用super(),则便与其会用super()调用无参数的父类构造器。
④如何父类也有父类,则先执行祖父类,再依次执行。
⑤在执行过程中会执行到最高的父类object。
⑥object执行后依次往子类执行
⑦构造器也会随着执行过程依次执行
注意:如果要使用super()或者this(),则必须将其放在执行代码第一行
如果没有调用super()或者this(),则编译器会自动调用无参构造器。
Java继承