JAVA抽象类与接口
接口是对类的抽象
一、抽象类
1、什么是抽象类?
A:生活中
某些类在现实世界中是不能直接找到其对应的实例的,如车这个类,不可能为它找到一个对应的事物,因为现实世界中只有汽车,自行车,火车等事物,而他们都是车的子类,不能说是车这个类的实例,这样的类称为抽象类。、
B:程序中
JAVA允许在类中只声明方法而不提供方法的实现。这种只有声明而没有方法体的方法称为抽象方法,而包含一个或多个抽象方法的类称为抽象类。抽象类在使用上有特殊的限制,即不能创建抽象类的实例。这是为了阻止程序员创建抽象类的实例队形,编译期在编译时刻对此进行检查,JAVA中要将抽象类和抽象方法带上abstract标记。
2、抽象类有什么用?
A:定义规范
B:实现多态
3、抽象类怎么用?
A:定义一个抽象类
/**
* 定义形状抽象类
* @author Administrator
*
*/
public abstract class Shape {
//定义一个求面积的方法
abstract public void area();
//定义一个求颜色的方法
public void color(){
System.out.println("yello");
}
}
B:定义抽象类的子类
/**
* 圆继承形状类
* @author Administrator
*
*/
public class Circle extends Shape {
private double r;
public Circle(double r) {
this.r = r;
}
//这里强制要求重写求面积的抽象方法,而求颜色的方法没要求
@Override
public void area() {
System.out.println("圆的面积:"+3.14*r*r);
}
}
C:定义抽象类的子类
/**
* 三角形继承形状类
* @author Administrator
*
*/
public class Triangle extends Shape{
private double height;
private double width;
public Triangle(double height, double width) {
this.height = height;
this.width = width;
}
//这里强制要求重写求面积的抽象方法,而求颜色的方法没要求
@Override
public void area() {
System.out.println("三角形的面积:"+height*width);
}
}
D:测试类
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
//父类的引用指向子类的实例
Shape shape = new Circle(3);
Test.diaplay(shape);
System.out.println("---------");
Shape shape1 = new Triangle(3,4);
Test.diaplay(shape1);
}
public static void diaplay(Shape shape){
shape.area();
}
}
E:测试结果
F:抽象类的特点
如果继承抽象类,子类必须重写抽象类里面的所有抽象方法,或者将子类定义为抽象类。而且抽象类不能实例化,抽象类里面可以定义实现方法。
二、接口
1、什么是接口?
A:生活中
USB接口,电源插座接口...
接口就像老板一样,只说不做,最高权力拥有者。
现实世界中,有各种各样的门,每种门都有不同的开关方法,所以在描述门的时候不能定义死某个具体的门类。可以抽象出门对象的共同属性,构造一个抽象的门类,定义其开关方法。让其具体门对象去实现各自的方法。
同时,如果有的门具有防盗功能,想想是不是应该把这个方法加在父类中呢?如果加在父类中,它的每个子类都要去实现这个方法,显然这样做是不科学的。要怎么办呢?此时接口就应该站出来了,定义一个接口并在其中定义一个报警的方法,如果哪个具体的门类有这个功能就去实现这个接口。
B:程序中
接口是用来实现类似多重继承功能的一种结构,它在语法上和类很类似,它有属性和方法,接口间也可以形成继承关系,但接口和类有着很大的区别,它的属性都是常量,方法都是抽象方法,没有方法体。接口使用Interface关键字定义。
2、接口有什么用?
A:一种规范,一种约束,有利于协作完成任务
B:多继承
C:是个性化,是一种优秀的表现
3、接口怎么用?
A:定义一个门类
/**
* 定义门抽象类
* @author Administrator
*
*/
public abstract class Door {
//定义开门抽象方法
abstract public void open();
//定义关门抽象方法
abstract public void colse();
}
B:定义门的实现类
/**
* 推拉门
* @author Administrator
*
*/
public class DoubleActingDoor extends Door implements Alarm{
@Override
public void open() {
System.out.println("我是推拉门,开我向前推");
}
@Override
public void colse() {
System.out.println("我是推拉门,关我向后推");
}
@Override
public void alarm() {
System.out.println("我有防盗功能额");
}
}
C:定义门的实现类
/**
* 卷帘门
* @author Administrator
*
*/
public class VolumePageDoor extends Door {
@Override
public void open() {
System.out.println("我是卷帘门,开我向上拉");
}
@Override
public void colse() {
System.out.println("我是卷帘门,关我向下拉");
}
}
D:定义一个接口
/**
* 警报接口
* @author Administrator
*
*/
public interface Alarm {
void alarm();
}
E:测试类
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
DoubleActingDoor dad = new DoubleActingDoor();
dad.alarm();
dad.open();
dad.colse();
System.out.println("---------");
VolumePageDoor vpd = new VolumePageDoor();
vpd.open();
vpd.colse();
}
}
F:测试结果
G:接口的特点
接口是更高级的抽象,接口里的属性和方法可以通过反编译可以看到:属性为常量(public static final),方法为抽象方法(abstract public)。同时接口里全部都是抽象方法。
三、接口与抽象方法的区别
A:相同点
(1)如果类要实现接口或抽象类必须重写它们里面的全部抽象方法
(2)接口和抽象类都不能实例化
B:不同点
(1)接口里属性全为静态常量,方法全为抽象方法。抽象类里不强制要求。
(2)类实现接口可以类似多继承,类实现抽象类只能单继承。