Java抽象类和接口

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

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 ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值