Java抽象类和接口

来源:互联网 发布:java垃圾回收机制算法 编辑:程序博客网 时间:2024/05/16 09:04

如何使用接口和抽象类,分析它们之间相似性和差异。

1- 介绍

2- 抽象类
3- 抽象类,实例
4- 接口
4.1- 接口结构
4.2- 类实现接口

1- 介绍

在本文中,我们将学习如何接口和抽象类,也是来分析它们之间相似性和差异。

2- 抽象类

对于抽象类,使用关键字 abstract 来创建一个类。 例如:
// This is an Abstract class.// It must be declared as abstract because it has an abstract method.public abstract class ClassA  { // This is an abstract method // It has no body. // Its access modifier is public public abstract void doSomething(); // Access modifier of this method is protected protected abstract String doNothing(); // This method does not declare access modifier // It has the default access modifier. abstract void todo() ;}// This is an abstract class// It is declared as abstract, though it does not have any abstract methods.public abstract class ClassB   {}

3- 抽象类,实例

参见如下图:
  • AbstractJob.java
package com.yiibai.tutorial.abs;// An abstract class (Simulating a job).// There are two methods declared abstractpublic abstract class AbstractJob {    public AbstractJob() {    }    // This is an abstract method.    // return Job Name.    public abstract String getJobName();    // This is an abstract method.    public abstract void doJob();}
  • JavaCoding.java
package com.yiibai.tutorial.abs;// Class implements all abstract methods of the parent class.public class JavaCoding extends AbstractJob {    public JavaCoding() {    }    // Implements abstract method of parent.    @Override    public void doJob() {        System.out.println("Coding Java...");    }    // Implements abstract method of parent.    // Method with body.    // Return name of Job.    @Override    public String getJobName() {        return "Coding Java";    }}
  • ManualJob.java
package com.yiibai.tutorial.abs;// AbstractJob has two abstract methods.// This class implements only one abstract method of parent class.// Therefore it must be declared as abstract.public abstract class ManualJob extends AbstractJob {    public ManualJob() {    }    // Implements abstract method of parent class.    @Override    public String getJobName() {        return "Manual Job";    }}
  • BuildHouse.java
package com.yiibai.tutorial.abs;// This class inherited from ManualJob// Build House undeclared abstract,// so it must implement all remaining abstract methods.public class BuildHouse extends ManualJob {    public BuildHouse() {    }    // Implements abstract methods of the parent class.    @Override    public void doJob() {        System.out.println("Build a House");    }}
示例如下:
  • JobDemo.java
package com.yiibai.tutorial.abs;public class JobDemo {    public static void main(String[] args) {        // Create AbstractJob        // from Constructor of JavaCoding.        AbstractJob job1 = new JavaCoding();        // Call doJob() method.        job1.doJob();        // getJobName is the abstract method in AbstractJob.        // But it was implemented in a certain subclass (JavaCoding).        // So can call it        String jobName = job1.getJobName();        System.out.println("Job Name 1= " + jobName);        // Create AbstractJob object        // from constructor of BuildHouse.        AbstractJob job2 = new BuildHouse();        job2.doJob();        String jobName2 = job2.getJobName();        System.out.println("Job Name 2= " + jobName2);    }}
运行示例结果如下:
Coding Java...Job Name 1= Coding JavaBuild a HouseJob Name 2= Manual Job

4- 接口

我们知道,一个类只能从一个父类扩展。
 public class B extends A  {   // ....} public class B  {} public class B extends Object  {}
但是,一个类可以扩展多个接口。
// a class can extends from only one parent class.// But can extends from multiple Interfaces.public class Cat extends Animal implements CanEat, CanDrink {  // ....}

4.1- 接口结构

  • NoAccessModifierInterface.java
package com.yiibai.tutorial.itf;// This is an interface not specified access modifier.// Only classes in the same package can implements this interface.interface NoAccessModifierInterface {}
  • CanMove.java
package com.yiibai.tutorial.itf; public interface CanMove {public abstract void run();// Method in interface is always public abstractvoid back();// Method in interface is always public abstractpublic int getVelocity();}
  • CanDrink.java
package com.yiibai.tutorial.itf; public interface CanDrink { public static final String PEPSI = "PEPSI";// Fields in Interface is always public static final.final String NUMBER_ONE = "NUMBER ONE";// Fields in Interface is always public static final.String SEVENUP = "SEVEN UP";public void drink();}
  • CanEat.java
package com.yiibai.tutorial.itf; public interface CanEat { public void eat();}

4.2- 类实现接口

  • Animal.java
package com.yiibai.tutorial.cls;import com.yiibai.tutorial.itf.CanMove;// This class extends from Object.// And implements CanMove interface.// CanMove has 3 abstract methods.// This class implements only one abstract method of CanMove.// Therefore it must be declared as abstract.// The remaining abstract methods to be implemented in the subclasses.public abstract class Animal implements CanMove {    // Implements run() method of CanMove.    @Override    public void run() {        System.out.println("Animal run...");    }}
  • Cat.java
package com.yiibai.tutorial.cls;import com.yiibai.tutorial.itf.CanDrink;import com.yiibai.tutorial.itf.CanEat;// This class extends Animal and implements CanEat, CanDrink interfaces.// This class not declared as abstract.// So it must implements all abstract methods of the interfaces.public class Cat extends Animal implements CanEat, CanDrink {    private String name;    public Cat(String name) {        this.name = name;    }    public String getName() {        return this.name;    }    // Implements method of CanMove    @Override    public void back() {        System.out.println(name + " cat back ...");    }    // Implements method of CanMove    @Override    public int getVelocity() {        return 110;    }    // Implements method of CanEat    @Override    public void eat() {        System.out.println(name + " cat eat ...");    }    // Implements method of CanDrink    @Override    public void drink() {        System.out.println(name + " cat drink ...");    }}
  • Mouse.java
package com.yiibai.tutorial.cls;import com.yiibai.tutorial.itf.CanDrink;import com.yiibai.tutorial.itf.CanEat;public class Mouse extends Animal  implements CanEat, CanDrink {   @Override   public void back() {       System.out.println("Mouse back ...");   }   @Override   public int getVelocity() {       return 85;   }   @Override   public void drink() {       System.out.println("Mouse drink ...");   }   @Override   public void eat() {       System.out.println("Mouse eat ...");   }}
  • AnimalDemo.java
package com.yiibai.tutorial.cls;import com.yiibai.tutorial.itf.CanEat;public class AnimalDemo {    public static void main(String[] args) {                // Inherit static field of CanDrink        System.out.println("Drink " + Cat.SEVENUP);        // Create CanEat object        // from constructor of Cat.        CanEat canEat1 = new Cat("Tom");        // An object declared as CanEat.        // But it is a Mouse        CanEat canEat2 = new Mouse();        // Polymorphism shown here.        // Java know the actual types of objects        // ==> Tom cat eat ...        canEat1.eat();        // ==> Mouse eat ...        canEat2.eat();        boolean isCat = canEat1 instanceof Cat;        System.out.println("catEat1 is Cat? " + isCat);        // Cast        if (canEat2 instanceof Mouse) {            Mouse mouse = (Mouse) canEat2;                        // Call drink method (Inherited from CanDrink).            mouse.drink();        }    }}
运行示例结果如下:
Drink SEVEN UPTom cat eat ...Mouse eat ...catEat1 is Cat? trueMouse drink ...
0 0