抽象类
概念:在一个类中存在一个功能,仅仅方法声明,没有方法体(抽象方法),需要将该类定义抽象类。
举例:动物 -----> 本身不是具体的(抽象的动物类)
动物的吃或者睡应该定义为抽象功能 ----> 必须强制子类必须重写抽象功能!(具体的动物:猫,狗等等)
特点:
-
1)如果一个类中有抽象方法,那么该类一定是抽象类;
如果一个类是抽象类,那么该类中不一定存在抽象方法;
-
2)抽象类不能实例化(不能创建对象)
-
3)抽象类不能实例化,如何实例化呢?
抽象类需要通过子类进行实例化,父类引用指向子类对象(父类是抽象类):抽象类多态!
抽象的父类是通过子类进行实例化,那么如果子类也是一个抽象类,子类也就不能实例化。
-
4)抽象方法的格式:没有方法体的方法
权限修饰符 abstract 返回值类型 方法名(形式参数)
abstract:表示抽象
可以修饰类,可以修饰方法
抽象类 必须强制子类完成的事情!(将抽象类中所有的抽象方法重写)
//定义一个Animal类
/*
class Animal{//这个必须使用抽象来定义
//具体的动物才具体的吃的功能,将吃的功能抽象(没有方法体)
public abstract void eat() ;
}
*/
//抽象的父类
abstract class Animal{//这个必须使用抽象来定义
//具体的动物才具体的吃的功能,将吃的功能抽象(没有方法体)
public abstract void eat() ;
public abstract void sleep();
}
//创建具体的子类
//abstract class Cat extends Animal{//本身就一个子类,还抽象类,没有意义!(不能实例化)
class Cat extends Animal{//必须强制类重写父类的抽象方法
public void catchMouse() {
System.out.println("猫抓老鼠");
}
@Override //检查当前这个方法是否是重写父类的功能
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void sleep() {
System.out.println("猫趴着睡觉");
}
}
//测试类
public class AbstractDemo {
public static void main(String[] args) {
//创建Animal类对象
//Animal a = new Animal() ; //抽象类不能实例化
//抽象类多态:父类引用指向子类对象
Animal a = new Cat() ;//向上转型
a.eat();
a.sleep();
//a.catchMouse();
//向下转型
Cat c = (Cat)a ;
c.catchMouse();
}
}
抽象类的成员特点:
1)成员变量
即可定义一个常量,也可以定义为变量
2)成员方法:
既可以定义抽象方法,也可以定义非抽象方法
3)构造方法:
存在构造方法,既可以有参构造也可以是无参构造方法(作用:对数据进行初始化)
抽象类成员方法特点:
-
成员方法如果是抽象方法,必须强制类完成的事情
-
成员方法如果是非抽象方法,子类继承父类–来提高代码的复用性!
如果一个类中没有抽象方法,那么这个类可不可以定义为抽象类呢?有什么意义?
- 1)可以定义.
- 2)意义就是不能直接创建对象!
- 该抽象类中的一些功能的返回值可能就是该类本身!
- 例如(日历类:Calendar它就是抽象类,里面的功能
- getInstance()非抽象方法,返回值就是该类本身)
abstract关键字不能和哪些关键字共用 (定义成员方法的时候)
- 和final关键字冲突
- 和private关键字冲突
- 和static关键字冲突
- 能够和public或者protected权限修饰符使用!
接口
**接口:**体现的是事物的一种扩展性功能.(本身不具备的,经过一些学习才能具备的功能!)
举例:猫和狗本身不具备的跳高的功能,经过特殊的训练—>具备这个功能!
接口如何表示:interface
接口中的注意事项:
-
1)接口中只能定义抽象方法
-
2)接口不能实例化
-
3)接口如何实例化呢?
通过接口的子实现类来进行实例化!
**格式:**接口名 对象名 =new 子实现类名(); 接口多态!
接口和子实现类之间的关系:实现关系(implements)
一般开发定义接口的子实现类的时候 , 类名: 接口名 + Impl
-
4)接口的子实现类
4.1)子实现类不是具体类(抽象类)---->抽象类不能实例化—存在具体的子类
4.2)子实现类研究的都是具体类! 因为具体的子实现类可以实例化(创建对象!)
package com.qianfeng_interface_03;
//定义一个接口:动物跳高接口
interface AnimalJump{ //体现的一种扩展功能(额外的功能,本身事物不具备的功能)
/*public abstract void jump() {//Abstract methods do not specify a body :抽象方法中不能有方法体
System.out.println("可以跳高了" ) ;
}*/
public abstract void jump() ;
}
//定义一个接口的子实现类
class CatJumpImpl implements AnimalJump{
@Override
public void jump() {
System.out.println("猫可以跳高了...");
}
}
//测试类
public class InterfaceDemo {
public static void main(String[] args) {
//创建对象
//AnimalJump aj = new AnimalJump() ; //接口不能实例化
// 格式:接口名 对象名 =new 子实现类名(); 接口多态!
AnimalJump aj = new CatJumpImpl() ;
aj.jump();
}
}
接口中 成员特点:
-
成员方法:
只能是抽象方法,存在默认的修饰符,public abstract
-
成员变量:
只能是常量.存在默认的修饰符:public static final
-
构造方法:
不存在构造方法!
类与类之间 (继承关系:extends ) :
只支持单继承,不支持多继承,但是可以多层继承!
类与接口之间的关系 (实现关系)implements :
一个类继承另一个类的同时,可以实现多个接口!
格式:类名 implements 接口名1,接口名2{
重写每一个接口中的抽象方法
}
接口与接口 (比如:集合框架 Collection—>List Set)
是继承关系,extends
(提高代码的复用性! 父接口中有的功能,子接口也具备该功能)
既可以单继承,也可以多继承!