我发现无论是在教学,还是在学习的过程中,由问题导入,然后引出概念、性质、结论的路线往往要比一开始就直接介绍概念要好的多。学习者容易理解,也更容易记住。本文采用问题导入:
上一篇文章介绍“多态”,代码如下
public class Test12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal1 a= new Cat1();
a.speak();
a =new Dog1();
a.speak();
}
}
class Animal1{
String name;
int age;
public void speak(){
System.out.println("我是动物,不知道怎么叫!!");
}
}
class Cat1 extends Animal1{
//Overriding
public void speak(){
System.out.println("我是小猫,喵喵喵!");
}
}
class Dog1 extends Animal1{
//Overriding
public void speak(){
System.out.println("我是小狗,汪汪汪!");
}
}
可以看到的是,父类animal的方法speak() 在写完以后,根本就没有用到,而且子类重写了该方法。因此该方法中的类容几乎就是没有用的,不需要写的。而且,有时候父类在定义该方法时没有想好要写什么类容。那么有什么方法可以解决这两个问题吗?
由此,引入“抽象方法”,code如下:
public class Test13 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal2 a= new Cat2();
a.speak();
}
}
abstract class Animal2{
String name;
int age;
abstract public void speak() ;
}
class Cat2 extends Animal2{
//Overriding
public void speak(){
System.out.println("我是小猫,喵喵喵!");
}
}
上面代码中speak()方法没有了“主体”,但是在前面加入了abstract进行修饰,而且值得注意的是在 animal类前面也加了abstract进行修饰。
概念:
1、使用abstract关键字类修饰的方法,叫做“抽象方法”。
2、使用abstract关键字来修饰的类,叫做“抽象方法”。
在使用的时候,有以下3点需要注意:
1、“抽象方法”不能有主体(当然如果你写了主体,在编译的时候也会报错)。
2、抽象类中不一定有抽象方法,但是含有抽象方法的类一定是抽象类。
3、当一个类继承抽象类,则该子类需要实现抽象类的所有抽象方法。
下面看“接口”,上code
public class Test15 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Phone p=new Phone();
Camara c=new Camara();
Computer cp=new Computer();
cp.start(p);
cp.stop(p);
cp.start(c);
cp.stop(c);
}
}
//定义一个 USB接口
interface Usb{
public void start();
public void stop();
}
//定义一个手机 ,实现了USB接口
class Phone implements Usb{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("我是手机,开始工作了!");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("我是手机,停止工作了!");
}
}
//定义一个照相机,实现USB接口
class Camara implements Usb{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("我是相机,开始工作了!");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("我是相机,停止工作了!");
}
}
//定义 电脑类
class Computer {
public void start(Usb usb){
usb.start();
}
public void stop(Usb usb){
usb.stop();
}
}
从以上代码可以看出,接口中的方法全部是抽象方法,没有一个不是。
接口的概念:在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。
注意事项:
1、接口不能被实例化。
2、接口中可以有变量。但是变量不能用private 或者protected 修饰。
a.接口中的变量,本质上是static 的,final的。不管是否加了static 、final修饰符。
b.在开发过程中,经常将全局变量 放在接口中,方便调用。调用方法:接口名.变量名。
3、一个接口不能继承其他类,但是可以“继承”其他接口。
4、接口中的所有方法都是抽象方法,都要被实现。
写完了抽象类和接口,那么他们之间有什么区别与联系呢?
1、抽象类(abstract class)和接口(interface)之间最大的区别就是,抽象类中的方法有抽象方法也有已实现的方法,而接口中全部都是抽象方法。(这是abstract class 相对于interface一个很大的优点,因为如果一个类继承了该abstract class,当abstract class中加入新的实现的方法时子类就会直接得到这个方法,而interface 中如果增加一个抽象方法,则实现interface的所有类都会报错。)
2、使用抽象类,那么继承这个抽象类的子类类型就比较单一,因为子类只能单继承抽象类;而子类能够同时实现多个接口,因为类型就比较多。接口和抽象类都可以定义对象,但是只能用他们的具体实现类来进行实例化。