1.抽象类
1)概念
在一个类中,将某个功能给出一个声明(抽象方法:没有方法体的方法),那么该类定义为抽象类
举例:
动物--->本身是一个抽象的事物
给出能吃的功能--->将eat方法:没有方法体{}
关键字:abstract:修饰类、修饰方法:抽象的意思!
2)抽象类的注意点:
1)如果一个类中,有抽象方法,那么该类一定是抽象类;抽象类中一定是抽象方法吗?,也可以有非抽象方法
2)抽象类如何实例化呢? 抽象类如何创建对象
抽象类不能直接实例化! ,通过具体的子类进行实例化
格式:
父类名 对象名 =new 子类名() ; 抽象类多态
3)抽象类的子类:
子类要么具体类,要么抽象类
子类是具体类,直接可以抽象类多态的形式实例化!
子类是抽象类,应该还要提供更最具体的子类,否则都无法实例化(没有意义!)
4)在抽象类中定义抽象方法的时候,那么抽象方法必须带上修饰符:abstract,不能省略!
3)抽象类的本质
强制子类必须完成的事情!
4)抽象类的特点
1)成员变量:
既可以定义常量,也可以定义变量
2)成员方法:
即可定义抽象方法(必须要有abstract),也可以定义非抽象方法
3)构造方法:
还是继承关系,构造方法:对数据进行初始化---->分层初始化!
5)实例化
有抽象方法的类一定是抽象类,那么如果一个类中没有抽象方法,这个类可以不可以定义为抽象类呢?
--->可以,意义是什么?
--->意义:就是让当前类不能够直接实例化(实例化:创建对象)
-->那么如何实例化呢?
它会提供一个静态功能,返回值就是该类本身! (Java中一种设计模式)
举例:
Calendar:常用类 ---日历类 是一个抽象类 (Java提供一个日历类)
在当前类提供了一个静态功能
public static Calendar getInstance()
6)abstract关键字不能和哪些关键字共存
不能和final一块使用:
final修饰成员方法:方法不能被重写,但是abstract修饰的方法,强制类完成的事情!
不能和private一块使用: private只能在类中访问!
被static修饰的方法直接使用类名调用,---->但是抽象方法又需要让子类重写(静态方法算不上方法重写)
方法重写注意事项:
子类继承父类,子类重写父类的方法必须保证访问权限足够大,使用public修饰(要么跟父类的修饰符保持一致)
2.接口
1)概念
interface 接口名{
...
}
接口中的方法只能是抽象方法,不能有方法体
接口的命名规则:多个单词---->遵循"大驼峰命名法"
接口的实现类和接口是一种:implements 实现关系
将接口的实现类--->称为"接口的子实现类"
2)接口实例化
接口不能直接实例化 ,
格式:
接口名 对象名 =new 子实现类名() ; //接口多态
开发中:做项目的时候
接口----->接口子实现类(接口名的后面+impl)
命名格式:
用户模块
用户接口
UserDao:(dao---->Data Access Object :数据访问对象)
用户接口实现类
class UserDaoImpl implements UserDao{
}
3)接口的特点
成员变量: 只能常量,被静态修饰
存在默认修饰符:public satic final...(可以省略不写!)
成员方法:
接口中的方法只能是抽象方法,存在默认修饰符:public abstract(可以省略不写!)
构造方法:
接口没有构造方法!
4)关系问题
类与类之间(继承的时候用了)
继承关系,只支持单继承,不支持多继承,但是可以多层继承!
类与接口之间
实现关系,一个类在继承另一个类的同时,可以实现多个接口!
接口与接口之间
继承关系,可以单继承,也可以多继承
3.抽象类和接口的区别
1)成员的区别
抽象类:
成员变量:既可以定义常量,也可以变量
成员方法:既可以是抽象方法,也可以是非抽象方法
构造方法:存在,存在无参构造/有参构造,对数据进行初始化!
接口:
成员变量---->此时是一个常量:存在默认修饰符
public static final...
成员方法:只能是抽象方法
构造方法:不存在构造方法
2)关系的区别:
类与类之间: extends,单继承,不支持多继承,但是可以多层继承!
类与接口:实现关系:implements:
一个类继承另一个类的同时,可以实现多个接口!
接口与接口:
继承关系:extends
可以单继承,也可以多继承!
3)设计理念的区别
抽象类:
由继承来保证代码的复用性,由多态来保证代码的扩展性
----体现一种"is a"的关系
接口:
是一种额外的功能,体现的是一种"like a"的关系
猫:部分猫可以跳高(实现跳高接口!)