Java 抽象类和接口

抽象类 

1.抽象类?先知道什么是抽象!

"你说话好抽象哦!" 在日常生活中,抽象这个词语似乎成为了晦涩难懂的代名词.实际上这并非抽象一词本来的意思. 'abstract' 抽象 来源于拉丁文,原来意思为(draw off)抽出,表示的人们从具体的事物中提取其中共性这一过程.在编程中,抽象是一个非常重要的概念,它允许程序员创建可以代表更广泛概念的代码结构.

上述文字本身就是一种抽象,把具体的抽象行为提取出来共性,从而变成我们对抽象的概念.抽象是人类文明的基石,所有的人类科学与文化由抽象产生,这其中包括计算机编程--这一抽象现实生活,创建通用解决方案的行为.

人们从月亮和太阳中抽象出来圆形

2.什么是抽象类

刚刚谈到抽象,现在回到抽象类,那抽象类顾名思义就是抽象的类,我们这里不去细说类这一本身就是抽象现实的结果,就编程世界而言,抽象意味着它不是具体存在的,而是作为一种概念,作为一种共性而存在的,例如:自然界有许多动物,鸡鸭牛羊......但是作为这些具体的生物的共性--动物,是"不存在的",没有哪个具体的生物的名字被叫做"动物",因为动物仅仅是抽象的结果,而不是具体的事物.

在Java中我们用abstract关键词来修饰抽象类和抽象方法,抽象方法不用具体的实现.

public abstract class Shape {
    // 普通成员变量
    double area;
    // abstract关键词修饰抽象方法
    public abstract void printS();
    // 普通方法
    public void printArea(){
        System.out.println("面积为"+area);
    }
    // 构造方法
    public Shape(double area){
        this.area = area;
    }
    // 静态方法
    static void staticshape(){
        System.out.println("抽象类中的静态方法");
    }
}

同时抽象类作为一种特殊的类,也和普通类一样,拥有作为一个普通类的特点:拥有数据成员,继承,方法实现构造函数,继承等特点.同时作为一种特殊的类,拥有如下几种特性.

1.抽象类不能实例化对象

Shape shape = new Shape();
// 编译出错 Error:(30, 23) java: Shape是抽象的; 无法实例化

2.抽象方法不能是private 的,被private修饰的方法,不能在子类中被重写和访问,这违背了我们创建一个抽象类的目的. 

abstract class Shape {
abstract private void draw();
}
// 编译出错 Error:(4, 27) java: 非法的修饰符组合: abstract和private

3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写

public abstract class Shape {
abstract final void methodA();
abstract public static void methodB();
}
// 编译报错: 
// Error:(20, 25) java: 非法的修饰符组合: abstract和final 
// Error:(21, 33) java: 非法的修饰符组合: abstract和static

4.抽象类一定要被继承,继承后的子类也必须实现抽象类中的抽象方法,除非子类也想成为抽象类

public class Triangle extends Shape{
    // 实现抽象方法
    @Override
    public void printS() {
        System.out.println("我是三角形");
    }
    // 构造方法
    public Triangle(double area) {
        super(area);
        //this.area = area;
    }
}

5.抽象类不一定要有抽象方法,但是有抽象方法的一定是抽象类.

总的来说,抽象类是一个专门用于继承的特殊类,包含的普通类的特点,另外的的特殊性从必须要被'继承'这一点衍生而出,同时不能实例化自身.

3.抽象类的作用

虽然说抽象类,但是使用抽象类相当于多了一重编译器的校验,我们在实例化抽象类的时候会导致编译器报错,使用抽象类相当于多了一层保险,在程序员编程的时候预防发生的错误.实际上有许多语法都是为了防止错误而存在的,例如final语法,能让我们在不小心修改常量的时候,编译器提醒我们.

接口

1.什么是接口

我们平时生活中也能见到不少的接口,例如:USB接口.USB这个接口为市场的电子设备提供了一种标准,为数据线提供了一种规范,不然的话假设每一种产品,每一种设备都有自己一套的数据传输标准,可以想象我们的数据线领域会有多混乱.在java中,接口简单的说就是多个类的公共规范.

2.接口的语法

在定义一个接口的时候,语法格式和一个普通的类是相同的,我们使用interface关键词来代替class来定义一个接口

// 在命名接口的时候,我们一般以大写的I来作为首字母
public interface IUsb {
    //接口中都是抽象方法
    public abstract void func1();//public abstract是固定格式,也可以被省略
    void func2();
}

我们定义一个接口就是为了去实现这个接口的,我们是使用implement关键词来"实现"接口,去实现接口中的抽象方法

public class Mouse implements IUsb{
    @Override
    public void func1(){
        System.out.println("鼠标输出的信息让鼠标在屏幕上的光标移动");
    }
    @Override
    public void func2(){
        System.out.println("鼠标点击的信息");
    }
}

我们在运用接口的时候也要注意一下几点

1.接口类型是一种引用类型,且不能被实例化

public class TestUSB {
public static void main(String[] args) {
USB usb = new USB();
} // Error:(10, 19) java: day20210915.USB是抽象的; 无法实例化
}

2.接口中有且只有抽象方法,在接口中我们不实现具体的方法,且接口中所有的方法都会被隐式的限定为public abstract,使用其他限定修饰符会报错.

3.重写方法的时候,不能使用默认权限.在子类重写或接口中的方法的时候,我们不允许子类的访问权限低于父类或接口中的方法.这涉及到多态的应用,如果重写的方法的权限不是public(低于这个权限),这违反了多态的基本要求--父类的引用可以调用子类的所有public方法.

4.接口中含有变量,会背隐式的指定为 public static final 变量

5.接口中不能有静态代码块和构造方法.

3.实现多个接口

在java中,是没有多继承的,类和类之间是单继承的,一个类只能有一个父类,但是一个类可以实现多个接口.

public class Test {
    public static void main(String[] args) {
       Dog dog = new Dog("123");
        dog.running();
        dog.eating();
    }

}
class Animals{
    public String name;

    public Animals(String name) {
        this.name = name;
    }
}
interface Irunning{
    void running();
}
interface Ieating{
    void eating();
}
public class Dog extends Animals implements Irunning,Ieating{
    public Dog(String name) {
        super(name);
    }

    @Override
    public void running() {
        System.out.println(name+"running");
    }

    @Override
    public void eating() {
        System.out.println(name+"eating");
    }
}

一个类实现多个接口的时候,要实现每个抽象方法,否则就要被设置为抽象类(就还要被继承).

4.接口之间的继承

我们可以使用extends关键词来实现接口与接口之间的继承.作用相当于将多个接口拼在一起.

interface IrunningIeating extends Ieating,Irunning{
    void runningandeating();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值