继承与多态

本文探讨了Java中的继承和多态概念。继承允许子类重写父类方法以改变或扩展行为,并确保子类拥有父类的所有方法。多态则强调子类可以作为父类类型使用,但父类不能使用子类的方法。文章还提到了方法的重载,即同名但参数不同的方法。此外,抽象类和接口作为继承的重要部分,抽象类包含抽象方法,而接口则定义了一组共同的协议,一个类可以实现多个接口。
摘要由CSDN通过智能技术生成

继承与多态

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之间有无继承关系,要注意是单向的关系
  • 子类能用父类的方法,而父类不能用子类的方法
最受限制限制程度最小
privatedefaultprotectedpublic
  • 子类是父类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可以实现多个接口,实现某接口的类必须实现它所有的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值