抽象类与接口

1、抽象类

①定义:就是没有具体实例的类,称为抽象类。关键字abstract修饰的就是抽象类。抽象类中可以定义域也可以定义方法,但不能生成抽象类的实例,因为抽象类的描述是不存在的。定义抽象类的意义在于使行为相似的对象有共同的父类,则可以用父类对象来表示子类对象,从而实现多态性。

②定义的形式:

1)抽象类的定义形式:

absract class 类名
{
    //类体;
}

2)抽象方法的定义

abstract 方法类型的方法名([形式参数]);//只有方法的声明,没有方法的实现。

值得注意的是:如果一个类中声明了抽象方法,则该类一定要定义为抽象类。当然抽象类中也可以定义非抽象方法。

abstract class Shape//抽象类的定义
{
    public abstract double area();
    public abstract double perimeter();

}

class Circle extends Shape
{
    private double radius;
    public Circle(double radius)
    {
        this.radius=radius;
    }
    public double area()//方法重写
    {
        return Math.PI*radius*radius;
    }
    public double perimeter()//重写
    {
       return 2*Math*PI*radius;
    }
}

class Rectangle extends shape
{
    public Rectangle(double width,double height)
    {
        this.width=width;
        this.heght=height;
    }
    public double area()
    {
        return width*heigth;
    }
    public double perimeter()
    {
        return 2*(width+heigth);
    }
}

public class Main()
{
    public static void main(String args[])
    {
        Shape ashape;//注意不可以分配内存,因为只是抽象的类,抽象类不可以创建对象
        //Shape ashape=new Shape 是错的
        aShape=new Circle(10);//可以用用抽象的父类对象表示子类对象
        Syetem.out .println("圆的面积和周长:");
        System.out.println("%.2f,%.2f\n",aShape.area(),aShape.perimeter());

        aShape=new Rectangle(15.2,10.8);
        Syetem.out .println("矩形的面积和周长:");
        System.out.println("%.2f,%.2f\n",aShape.area(),aShape.perimeter());
    
    }

}

2、接口

①定义:接口可以看作是特殊的抽象类,但是他与类又不同。类是对同一事物的描述,但是接口可以对不同类的事物进行描述。接口还可以有多个父接口。接口必须通过类才可以实现。Java不支持多继承(除了Object类之外),但是一个类可以同时实现多个接口。实现接口的过程也就是定义类的过程,但是这个类要定义这个接口中所有的方法

②定义的形式:

interface 接口名
{
    //符号常量定义
    //方法声明
    
}
interface 接口名 extends 父接口列表
{
    //符号常量定义
    //方法声明
}

③接口的使用

实例:

代码

interface Shape
{
    public final static double PI=3.1415926;
    public abstract double area();
    public abstract double perimeter(); 
}

calss Circle imlements Shape
{
    private double radius;
    public Circle(double radius)
    {
        this.radius=radius;
    } 
    public double area()
    {
        return PI*radius*radius;   //值得注意的是这里的PI并不是Math里的,而是接口里面的
    }
    public double perimeter()
    {
        return PI*radius;  
    }

}

public class Main()
{
    public static void main(String args[])
    {
        shape aShape;
        ashape =new Circle(10);
        Syetem.out .println("圆的面积和周长:");
        System.out.println("%.2f,%.2f\n",aShape.area(),aShape.perimeter());
         
    }

}

3、抽象类和接口的比较

其实从上面的两个实例来看二者是可以替换的。但他们的实质却不同,抽象类用于表示同一类对象的共同属性和行为;而接口可以表示不同类的对象的属性和行为。

实际例子:不同类实现接口

interface Charge
{
    public void 收费();//抽象方法
}

class Cinema implements Charge
{
    public void 收费()
    {
        System.out.println("电影票10元一张。");
    }

}

class Taxi implements Charge
{
    public void 收费()
    {
        System.out.println("出租车的基础价格时9.9元");
    }

}

class Highway implements Charge
{
    public void 收费()
    {
        System.out.println("高数公路收费25.0元");
    }

}

class Mian
{
    public static void main(String args[])
    {
        Charge charge;
        charge=new Cinema();
        charge.收费();
        
        charge=new Taxi();
        charge.收费();

        charge=new Highway();
        charge.收费();

    }

运行结果为:

电影票10元一张。

出租车的基础价格时9.9元

高数公路收费25.0元

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值