java中抽象类和接口的区别

本文探讨了Java中的抽象类和接口的区别与应用。抽象类用于表示一般与特殊类之间的is-a关系,提供子类共享的变量和行为接口。接口则侧重于通用代码和多态实现,体现can-do关系。示例展示了如何创建抽象类`Shape`及其子类如`Rect`、`Circle`、`Triangle`,以及如何使用接口`Washer`和其实现类`RoseBrand`。总结了抽象类与接口在继承和实现上的异同。
摘要由CSDN通过智能技术生成

抽象类和接口

一、抽象类

  • 抽象类和具体类的关系就是一般类和特殊类之间的关 is-a ,在继承体系中对外提供抽象的子类公共的行为接口
  • 抽取共同行为接口,抽取可复用的变量
public abstract class Shape {
   protected double x,y,z; //子类可见
   //抽象方法
   abstract public double getArea();
   abstract public double getPerimeter();

   //抽象类可以有构造方法,初始化从父类继承的实例变量
   public Shape(double x,double y,double z){
     this.x = x;
     this.y = y;
     this.z = z;
   }
}


public class Rect extends Shape {
  public Rect(double height, double width) { super(height,width, 0.0); }
  public double getArea(){
     return x * y;
  }
  public double getPerimeter(){
     return (x + y)*2;
  }
}


public class Circle extends Shape{
   public Circle(double radius){
       super(radius,0.0,0.0);
   }
   public double getArea(){ 
        return( x * x *Math.PI);
   }
   public double getPerimeter(){
        return(2*Math.PI* x);
   }}

public class Triangle extends Shape {
 public Triangle(double lenX,double lenY,double lenZ){
       super(lenX, lenY, lenZ);
 }
  public double getArea(){
     double m= (x + y+ z)/2.0;
     return Math.sqrt(m*( m-x)*( m-y)*(m-z));
  }
  public double getPerimeter(){
      return x + y + z;
  }}


public class TestShape {
   public static void main(String[] args) {
   Rect rect = new Rect(25,25);
   Triangle tri = new Triangle(5,5,8);
   Circle cir = new Circle(12.5);
   printArea(rect);
   printPerimeter(rect);
   printArea(tri);
   printPerimeter(tri);
   printArea(cir);
   printPerimeter(cir);
  }

   public static void printArea(Shape s){
       System.out.println(s.getClass().getName() +
                         " Area:"+s.getArea());
  }
   public static void printPerimeter(Shape s){
       System.out.println(s.getClass().getName() +
                         "Perimeter:"+s.getPerimeter());
  }
}

在这里插入图片描述
在这里插入图片描述

二、接口

  • 接口的设计用途:通用可扩展代码,多态体现
public interface  Washer {
    public static final int ON = 1 ;
    public static final int OFF = 0 ;
    abstract void startUp();     //启动  
    abstract void letWaterIn();  //进水
    abstract void washClothes(); //洗衣
    abstract void letWaterOut(); //排水
    abstract void stop();        //停止
}

class RoseBrand implements Washer{
    public  void startUp(){System.out.println("startUp");}
    public  void letWaterIn(){System.out.println("letWaterIn");}
    public  void washClothes(){System.out.println("washClothes");}
    public  void letWaterOut(){System.out.println("letWaterOut");}
    public  void stop(){System.out.println("stop");}
    public  void dehydrate(){System.out.println("dehydrate ");}//脱水
}


public class Consumer {
  public static void main(String args[]){
      //接口声明引用实现接口的RoseBrand类的对象。
      Washer  w = new RoseBrand();
      w.startUp();
      w.letWaterIn();
      w.washClothes();
      w.letWaterOut();
      w.stop();
      //w.dehydrate ();当通过接口调用玫瑰洗衣机类独有的,  
                     //接口未定义的功能方法,编译会报错。
  }  
}


三、两者区别

共同点:

  • 二者都可具有抽象方法
  • 都不能实例化,但都可有自己的声明,并能引用子类或实现类对象。

不同点:

在这里插入图片描述

抽象类在被继承时体现的是 is a 的关系,接口在被实现时体现的是 can do 的关系

本篇文章只举例说明了两者的不同,详细内容请点击 => 多态详细讲解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值