day14_java面向对象

抽象类与抽象方法

在这里插入图片描述

abstract关键字

  • abstract抽象的,可以用来修饰:类和方法
  • abstract修饰类(抽象类):
    • 此类不能实例化
    • 抽象类中也含有构造器,便于子类实例化调用
    • 一般会提供抽象类的子类,让其子类进行实例化,来实现相关功能
  • abstract修饰方法(抽象方法):
    • 抽象方法只有方法的申明,没有方法体
    • 含有抽象方法的类一定是抽象类;抽象类中不一定含有抽象方法
    • 若子类重写了父类中所有抽象方法,则子类方可实例化;若子类没有重写父类中所有抽象方法,则此子类也为抽象类
  • 抽象类的应用场景:
    • 抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类
      • 如:计算车辆的燃料与里程的关系时,不同类型车辆,两者之间的关系不同
  • abstract使用的注意点:
    • abstarct不能修饰私有方法、静态方法、final修饰的方法
      • 因为只有静态方法才能被重写
  • 抽象类可以存在多态的情形
  • 抽象类的匿名子类对象:
    • 匿名对象:new 类名(),没有给实例化的对象赋给变量
    • 抽象类的匿名子类:
      • new 匿名父类名(){抽象父类中匿名方法的重写代码}

模板方法的设计模式

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模 板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象 类的行为方式

具体应用:

在软件开发中实现一个算法时,整体步骤很固定、通用, 这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式

接口(interface)

为什么引入接口
  • 一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方 法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果
  • 另一方面,有时必须从几个类中抽取出一些共同的行为特征,而它们之间又 没有is-a的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打 印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都 支持USB连接
接口的使用和说明:
  • 接口使用interface来定义
  • java中,接口和类是并列的两个结构
  • 定义接口:定义接口中的成员
    • JDK7及以前:只能定义全局常量和抽象方法
      • 全局常量的申明:public static final,在接口中也可以省略,默认所有量为全局常量
    • JDK8及以后:除了定义全局常量和抽象方法外,还可以定义静态方法,默认方法
  • 接口中不能定义构造器–>>接口不能实例化
  • Java中,接口通过类去实现(implements)的方式来使用
    • 若实现类实现了接口中的所有抽象方法,则此实现类可以实例化;否则,此实现类仍为一个抽象类
  • java类可以实现多个接口,弥补了类的单继承性
    • 格式:class 类名 extends 父类名 implements 接口1,接口2...
  • 接口与接口之间可以继承,而且存在多继承
    • 格式:interface 接口1 extends 接口2,接口2,...
  • 接口也体现了多态性
  • 接口也是一种规范
  • 接口也可以实现匿名实现类的匿名对象
关于接口的面试题:
No.1

在这里插入图片描述

问题:编译不通过

在这里插入图片描述

问题解决:如何指定调用父类还是引用中的变量:

在这里插入图片描述

No.2

在这里插入图片描述

java8中接口的新特性:
  1. 接口成员含有:全局常量,抽象方法,静态方法,默认方法
  2. 静态方法在接口的实现类中不可见
  3. 实现类的对象可以调用接口中的默认方法,并且实现类可以重写接口中的默认方法
  4. 若子类(或实现类)继承的父类与实现的接口中含有同名同参数的方法,则默认调用的是父类中同名同参数的方法
  5. 若实现类实现多个接口,这多个接口中定义了同名同参数方法,则实现类没有对此方法进行重写的情况下,会出现编译报错(冲突)
  6. 直接在实现类中调用接口中的定义的默认方法:接口名.super.默认方法
  7. 默认方法:default关键字修饰的方法

内部类的使用

Java中,允许一个类的定义位于另一个类的内部,前者称为内部类(Inner class),后者 称为外部类

内部类的分类:
  1. 成员内部类(类内):静态成员内部类 vs 非静态成员内部类
    1. 作为一个类:
      1. 类内可以定义属性,方法 ,构造器等
      2. 可以被final等关键字修饰
    2. 作为外部类成员:
      1. 可以调用外部类的结构:外部类名.this.成员
      2. 可以被static和四种权限修饰符修饰
    3. 实例化成员内部类:
      1. new 外部类名.内部成员类名
      2. 调用内部类的属性:this.属性
      3. 调用外部类属性:外部类名.this.属性
  2. 局部内部类(方法内,代码块内,构造器):
    1. 应用场景:返回一个实现了某个接口的实现类
    2. 注意点:在局部内部类中的方法中,如果调用外部类类所申明的方法中的局部变量,要求此局部变量为final
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值