继承与多态
public class Application {
public static void main(String[] args) {
Doctor doctor = new Doctor();
doctor.treatPatient();
System.out.println("===========================");
FamilyDoctor familyDoctor=new FamilyDoctor();
familyDoctor.makesHouseCalls=true;
System.out.println(familyDoctor.worksAtHospital);
System.out.println(familyDoctor.makesHouseCalls);
familyDoctor.giveAdvice();
familyDoctor.treatPatient();
System.out.println("===========================");
Surgeon surgeon =new Surgeon();
surgeon.treatPatient();
surgeon.makeIncision();
}
}
public class Doctor {
boolean worksAtHospital;
void treatPatient(){
System.out.println("我是一名普通的医生");
}
}
public class FamilyDoctor extends Doctor {
boolean makesHouseCalls;
void giveAdvice(){
System.out.println("你的家人需要我的帮助");
}
}
public class Surgeon extends Doctor{
@Override
void treatPatient() {
System.out.println("去进行手术把");
}
void makeIncision(){
System.out.println("Go FOR IT ");
}
}
- 覆盖的意思是由子类重新定义继承下来的方法以改变或延伸此方法的行为
- 用继承来防止子类中重复出现的程序代码
- 使用"X IS A Y "来判断x和y之间有无继承关系,要注意是单向的关系
- 子类能用父类的方法,而父类不能用子类的方法
最受限制 | 限制程度最小 | ||
---|---|---|---|
private | default | protected | public |
- 子类是父类extends出来的
- 继承下来的方法可以被覆盖掉,但实例变量不能被覆盖掉
- 继承让你可以确保某个父型之下的所有类都会有父型所持有的全部方法,会通过继承来定义相关类之间的共同协议
- 当你定义出一组类的父型时,你可以用字型的任何类来填补任何需要或期待父型的位置
- 加上final来防止特定的类被覆盖,将整个类标识成final表示没有任何的方法可以被覆盖
- 覆盖的规则:
- 参数必须要一样,且返回类型必须要兼容
- 不能降低方法的存取权限
方法的重载
- 两个方法的名称相同,但参数不同,重载与多态毫无关系
- 重载可以有同一方法的多个不同参数版本以方便调用
- 不可以只改变返回类型
- 可以更改存取权限
接口与抽象类
-
抽象类除了被继承过之外,是没有用途,没有值,没有目的的
-
抽象的方法没有实体
-
抽象类中才能有抽象方法 (abstract)
-
抽象方法的意义是:
- 就算无法实现出方法的内容,但还是可以定义出一组字型共同的协议
-
实现抽象的方法就如同覆盖过方法一样,继承树结构下的第一个具体类必须要是先出所有的抽象方法
-
在Java中的所有类都是从Object这个类继承出来的,它是所有类的父亲
-
没有直接继承过其他类的类会是隐含的继承对象
-
任何从ArrayList取出的东西都会被当作Object类型的引用而不管他原来是什么
-
从ArrayList取出的Object都会被当作是Object这个类的实例。编译器无法将此对象识别为Object以外的事物
-
编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object确实的类型
-
对象类型转换: 使用instanceof 来判断两者石佛可以转换
Object o =al.get(index);
if( o instanceof Dog){
Dog d = (Dog) o ;
}
d.roam();
- 接口
public interface Pet{
void beFriendly();
void play();
}
- 接口的方法必须是抽象的,以" ; " 结束,implements 后面跟接口名称
public class Dog extends Canine implements Pet{
public void beFriendly(){...}
public void play(){...}
}
- extends 只能有一个,implement可以有好多个
- 可以使用super关键字来引用父类的对象
abstract class Report{
void runReport(){...}
void printReport(){...}
}
class BuzzwordsReport extends Report{
void runReport(){
super.runReport();
buzzwordCompliance();
printReport();
}
void buzzwordCompliance() {...}
}
- Java不允许多重继承,因为会有致命方块的问题
- class可以实现多个接口,实现某接口的类必须实现它所有的方法