如何使用接口和抽象类,分析它们之间相似性和差异。
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 abstract public 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 Java Build a House Job 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 abstract void back(); // Method in interface is always public abstract public 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 UP Tom cat eat ... Mouse eat ... catEat1 is Cat? true Mouse drink ...