Java语言之抽象类与接口

抽象类

  • 概述:动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
    在Java中一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
  • 抽象类的特点:
    • A:抽象类和抽象方法必须用abstract关键字修饰
    • B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
    • C:抽象类不能实例化
      • 因为它不是具体的,抽象类可以有构造方法,但是不能实例化,那么构造方法的作用是什么呢?
        作用:用于子类访问父类数据的初始化
    • D:抽象的子类
      • 如果不想重写抽象方法,该子类一定是个抽象类
      • 重写所有的抽象方法,该子类是一个具体的类

抽象类的实例化其实是靠具体的子类实现的是多态的方式
Animal a = new Cat() ;

抽象类的成员特点:

  • 成员变量既可以是变量也可以是常量。

  • 构造方法:有
    用于子类访问父类数据的初始化
    成员方法:既可以是抽象的也可以是非抽象的

  • 抽象类的成员方法特性:
    A:抽象方法强制要求子类做的事情
    B:非抽象方法子类继承的事情提高代码复用性

abatract不能和哪些关键字共存
private 冲突
final 冲突
static 无意义

接口

概述:为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可。

接口的特点

  • A:接口用关键字interface表示
    格式:interface 接口名 {}
  • B:类实现接口用implements表示
    class 类名 implements 接口名 {}
  • C:接口不能实例化
    那接口如何实例化呢?
    按照多态的方式来实例化
  • D:接口的子类
    a:可以是抽象类。但是意义不太
    b:可以是具体类。要重写接口虫的所有抽象方法。(推荐方案)

由此可见:
A:具体类多态(几乎没有)
B:抽象类多态(常用)
C:接口多态(最常用)

接口成员特点

  • 成员变量:只能是常量,并且是静态的
    默认修饰符是public static final
  • 构造方法:接口没有构造方法
  • 成员方法:只能是抽象方法
    默认修饰符是:public abstract

  • 类与类:
    继承关系,只能单继承,可以多层继承
  • 类与接口:
    实现关系,可以单实现,也可以多实现。
    并且还可以在继承一个类的同时实现多个接口。
  • 接口与接口
    继承关系,可以单继承,也可以多继承。

抽象类和接口的区别

  • 成员区别:

    • 抽象类
      • 成员变量:既可以是变量,也可以是常量
      • 构造方法:有
      • 成员方法:可以是抽象的,也可以非抽象的
    • 接口
      • 成员变量:只可以是常量
      • 构造方法:无
      • 成员方法:只可以抽象
  • 关系区别

    • 类与类: 继承关系,只能单继承,可以多层继承
    • 类与接口:实现关系,可以单实现,也可以多实现。
    • 接口与接口:继承关系,可以单继承,也可以多继承。
  • 设计理念区别

    • 抽象类被继承体现的是: "is a”的关系,抽象类中定义的是该继承体系的共性功能。
    • 接口被实现体现的是"like a”的关系,接口中定义的是该继承体系的扩展功能。

形式参数:

  • 基本类型:
  • 引用类型:
    类名: (匿名对象的时候其实我们已经进过了)需要的是该类的对象
    抽象类:需要的是该抽象的类子类对象
    接口:需要的是该接口的实现类对象

返回值类型

  • 基本类型: (基本类型太简单我不准备进解)
  • 引用类型:
    类:返回的是该类的对象
    抽象类:返回的是该抽象类的子类对象
    接口:返回的是该接口的实现类的对象

链式編程:
每次调用完毕方法后,返回的是一个对象。

1,其实就是文件夹
2,作用:

  • 区分同名的类
  • 对类的进行分类管理

3,包的定义

  • package 包名; 多级包用.分开

4,注意事项:

  • A:package语句必须是程序的第一条可执行的代码
  • B:package语句在一个Java文件中只能有一个
  • C:如果没有package,默认表示无包名

导包:
格式:import 包名;
这种方式 导入是到类的名称。
注意:我们用谁就导谁。
package,import,class的顺序
package>import>class

权限修饰符

在这里插入图片描述
在这里插入图片描述

常见的修饰符

(1)分类:

  • 权限修饰符:private,默认,protected,public
  • 状态修饰符:static,final
  • 抽象修饰符:abstract

(2)常见的类及其组成的修饰
类:

  • 默认,public,abstract,final
  • 常用的:public

成员变量:

  • private,默认,protected,public,static,final
  • 常用的:private

构造方法:

  • private,默认,protected,public
  • 常用的:public

成员方法:

  • private,默认,protected,public,static,final,abstract
  • 常用的:public

(3)另外比较常见的:

  • public static final int=10;
  • public static void show(){}
  • public final void show(){}
  • public abstract void show();

内部类

(1)概述:把定义在其他类内部的类,这样的类就被称为内部类
(2)内部类的访问特点:

  • A:内部类可以直接访问外部类的成员,包括私有。
  • B:外部类要想访问内部类的成员,就必须创建内部类对象

(3)内部类的分类

  • 成员内部类
  • 局部内部类

(4)成员内部类

  • A:private为了数据的安全性
  • B:static为了访问的方便性

成员内部类不是静态的:
外部类名.内部类名 对象名= new 外部类名.new 内部类名();
成员内部类是静态的。
外部类名.内部类名 对象名= new 外部类名.内部类名();

(5)局部内部类

  • A:局部内部类访问局部变量必须加final修饰。
  • B:为什么呢?
    因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
    所以,堆内存还是用该变量,而该变量已经没有了。
    为了让该值还存在就加final修饰。
    通过反编译工具我们看到了加入final后,堆内存直接存储的是值而不是变量名。

匿名内部类

匿名内部类

  • A:是局部内部类的简化形式
  • B:前提:存在一个类或者接口
  • C:格式:
    new 类名或者接口名() {重写方法;}
  • D:本质:其实是继承该类或者实现接口的子类匿名对象

匿名内部类在开发中的使用,
我们在开发的时候,会看到抽象类。或者接口作为参数。
而这个时候我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值