抽象类与接口

前言:不知不觉,Java基础知识我们就要学习抽象类与接口了,简单来说,概念上的东西不难,但是用处很大,灵活运用比较困难,希望大家认真学起来。

今天的内容:

  • 抽象类的概念、关键字、声明、实例
  • 接口的概念、关键字、声明、实例
  • 接口与抽象类的的异同

1. 抽象类的概念:

类中的抽象方法,只声明而未实现的方法我们称为抽象方法,所有的抽象方法都需要用abstract关键字声明,包含抽象方法的类也需要使用abstract关键字声明,称为抽象类,抽象类和普通类相比,区别在于抽象类带有抽象方法,抽象方法可以只声明,而不需要方法体,带抽象方法的类一定是抽象类,抽象类不一定带有抽象方法。

  • (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法
  • (2) 抽象类不能被实例化
  • (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类
  • (4) 具体派生类必须覆盖基类的抽象方法
  • (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们

注意:一个类之只能继承一个抽象类

2. 抽象类的关键字: abstract,只是在普通类的前面加了这个关键字,就是抽象类

abstract class 类名{
.......
}

3. 运用到实例程序:
   abstract class BaseAndriod {
    {
    System.out.println("预先工作,锻炼身体");
    }
    //定义一个属性,用于保存数据
    public String javabook;
    public  Dream dream;
    public  BaseANdriod(String javabook,String dream ){
    this.javabook = javabook;
    this.dream= new Dream();
    this.dream.name = dream;
   }

    //定义一个静态的常量
   public static   final String CBOOK = "C PRIMIER";
   public abstract void studyC();  //定义一个抽象的方法, 抽象方法不  要实现  子类来实现

   //定义一个普通类,已经确定这个犯法的具体实现
    public void studyJava(){
     System.out.println("参java培训班");
   }
   //定义一个内部类,用于管理每个人的梦想
   class Dream{
    public String name;
    public void show(){
        System.out.println("我的的梦想"+name);
        }
      }
   }

下面定义一个类来继承上面的抽象类

  class Student extends BaseAndriod{
  String name;
  public void studyC(){
    System.out.println("看书学习");
    }
    public Student(String name,String bookname,String dream){
     super(bookname,dream);
    this.name = name;
    }

  }

如果继承一个抽象类,就要实现抽象方法,如果不实现抽象类中的所有抽象方法,只能把这个类定义为抽象类。BaseAndriod 抽象类中有两个抽象方法,在子类Student中都具体实现了这两个方法,所以Student类,不需要定义为抽象类,可以实例化对象了。

如下:

  public class MyClass {
  public  static void main(String[] args){
    //1显示的创建一个对象  可以创建多个
  Student student = new Student("xian","java","offer");
 student.studyC();
student.studyJava();
      }
}

运行结果:
4. 接口是什么:

在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

  • (1) 接口不能被实例化
  • (2) 接口只能包含方法声明
  • (3) 接口的成员包括方法、属性、索引器、事件
  • (4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员

接口的声明

interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
实例

interface Animal {
 public void eat();
 public void travel();
}

public class MammalInt implements Animal{

   public void eat(){
      System.out.println("Mammal eats");
   }

     public void travel(){
      System.out.println("Mammal travels");
   } 

   public int noOfLegs(){
      return 0;
   }

   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

运行结果:

  • Mammal eats
  • Mammal travels
5. 接口和抽象类的区别:
  • (1)抽象类可以有构造方法,接口中不能有构造方法。
  • (2)抽象类中可以有普通成员变量,接口中没有普通成员变量
  • (3)抽象类中可以包含静态方法,接口中不能包含静态方法
  • (4) 一个类可以实现多个接口,但只能继承一个抽象类。
  • (5)接口可以被多重实现,抽象类只能被单一继承
  • (6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
6. 接口和抽象类的相同点:
  • (1) 都可以被继承
  • (2) 都不能被实例化
  • (3) 都可以包含方法声明
  • (4) 派生类必须实现未实现的方法

讲到这里你是不是有点疑惑了,什么时候该用抽象类,什么时候用接口呢???
首先需要明确:

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
Java中一个类只能继承一个抽象类(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

那么什么时候用什么呢??
当关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

好,概念性的东西讲完了,下面实战开始:
要求 : 计算程序执行的时间

首先定义一个抽象类Time类

abstract class Time {
//获得具体实现的代码
public abstract void code();
 //提供一个方法实现测量
 public void time(){
     long start = System.currentTimeMillis();
     code();
     long end = System.currentTimeMillis();
     System.out.println(end - start);
       }
     }

定义一个mycode类继承抽象类Time

class mycode extends  Time{

 @Override
 public void code() {
     //写自己的测试代码
     int total= 0;
     for(int i = 0;i <1000000;i++){
         total += i;
       }
   }
 }

程序入口:

public class MyClass {
public  static void main(String[] args){
mycode my = new mycode();
my.time();
     }
 }

运行结果:


好了,今天的内容就结束了,是不是感觉,概念上的东西超级简单,但是自己写程序的时候就有点怀疑自已学的东西是不是不是这个知识点呢?写程序的时候无从下手,没事,不要太过于担心,这只是说明,你思想还是C语言面向过程式思想,好好学习几天,多写写java程序,就会继承java面向对象思想了。

你可能感兴趣的:(抽象类与接口)