zoukankan      html  css  js  c++  java
  • 2020.7.25

    学习内容:

    接口

    接口是Java语言中为解决无法实现多继承而提供的一个解决方案,接口中没有实际的方法实现,只定义了一些空壳。一个类可以通过实现接口来实现多重继承关系。

    1、接口的概念

    接口就是一种特殊的抽象类,接口中只提供了方法的原形,但没有具体的方法实现,子类必须提供父类中抽象方法的实现方式。

    接口和抽象类一样,也可以定义抽象的方法,并且在接口中只能够包含抽象的方法和常量,不能有变量、初始化块和构造函数。

     由此代码可以看出,接口中的方法都是抽象类,并没有方法具体的实现。接口中的方法必须由接口的实现类来实现

    2、接口的声明

    使用 interface 来定义一个接口。

    接口定义同类的定义类似,也分为接口的声明和接口体,其中,接口体由常量定义和方法定义两部分组成

    定义接口的基本格式如下:

     注:与Java的类文件一样,接口文件的文件名必须与接口名相同

    3、接口的使用

    接口不能单独实例化,要想实例化接口,必须通过接口的实现类来完成。

    接口的实现类,必须全部实现接口中的所有方法,接口就是标准,用来隔离具体实现的。

    接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键字 implements ,其基本格式为:

    [修饰符] class < 类名 > [extends 父类名] [implements 接口列表]{  }

     

    4、Java接口的特征归纳

    (1)Java接口中的成员变量默认都是 public、static、final 类型的,而这三个类型其实都可以省略,接口中的成员变量为常量,并且建议全部使用大写,单词之间用“_”分隔

    (2)Java中的方法默认都是public、abstract类型的,并且public和abstract可以省略。接口中的方法没有方法体,不能被实例化

    (3)Java接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法

       接口中的变量必须初始化,并且方法必须是抽象方法。否则会报错

    (4)接口中没有构造方法,不能被实例化

       因为接口是不能被实例化的,因此没有构造方法,如果有就会报错

    (5)一个接口不能实现另一个接口,但它可以继承多个其他的接口

    (6)Java接口必须通过类来实现它的实现类来实现抽象方法

    (7)当类实现了某个Java接口时,他必须实现接口中的所有抽象方法,否则,这个类必须声明为抽象的

    (8)不允许创建接口的实例,但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

    (9)一个类只能继承一个直接的父类,但可以实现多个接口,间接地实现了多继承

    5、接口的继承

    Java中的类是属于单继承的,Java中的接口也可以实现继承,并且接口可以实现多继承

    不允许类多重继承的主要原因:如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承哪一个呢?但接口不存在这样的问题,接口全都是抽象方法,继承谁都无所谓,所以接口可以继承多个接口

    6、标记接口

    标记接口是没有任何方法和属性的接口,它仅仅表明它的类属于一个特定的类型,供其他代码来测试。使用标记接口的唯一目的是可以用 instanceof 进行类型查询,例如:if(obj instanceof Cloneable){...}

    在Java中常见的标记接口有 Serializable接口 和 Clone接口

    (1)java.io.Serializable 接口

    该接口仅仅表明,实现该接口的类,可以实现类的序列化和反序列化。标记接口仅仅是一个标记,此种接口并没有抽象方法

    (2)java.lang.Cloneable 接口

    该接口表明 Object.clone()方法可以合法地对该类实例进行按字段复制。实现此接口的类应该使用公共重写 Object.clone

    7、综合实例

    (1)定义一个接口叫Car,该接口中有3个方法,分别是 getName()--获得车的名字,getColor()--获得车的颜色,getPrice()--获得车的价格

    package day01;
    public interface Car {
        public String getName();
        public String getColor();
        public double getPrice();
    }

    (2)然后写一个BMW类来实现这个接口

    package day01;
    
    public class BMW implements Car{
        @Override
        public String getColor() {
            String Color="红色";
            return Color;
        }
        @Override
        public String getName() {
            String name="宝马";
            return name;
        }
        @Override
        public double getPrice() {
            double price=800000;
            return price;
        }
    }

    (3)最后写一个测试类CarTest

    package day01;
    
    public class CarTest {
        public static void main(String[] args) {
            Car car=new BMW();
            String name=car.getName();
            String color=car.getColor();
            double price=car.getPrice();
            System.out.println("3年后我将送给女朋友一辆"+name+",颜色是"+color+",价格是"+price+"元");
        }
    }

    遇到的问题:

    1.@overeide 是什么意思?

    @Override简单理解就是这个句话下边的方法是继承父类的方法,对其覆盖。比如toString()方法的话,在方法前面加上@Override 系统可以帮你检查方法的正确性,@Override public String toString(){...}这是正确的一旦写错 写成这样@Override public String tostring(){...}编译器可以检测出这种写法是错误的 这样能保证你的确重写的方确而如果不加@Overridepublic String tostring(){...}这样编译器是不会报错的 它只会认为这是你自己新加的一个方法而已------------------------------------------------------------@Override的用法:Override:java.lang.Override是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。使用方法极其简单:在使用此annotation时只要在被修饰的方法前面加上@Override。下面的代码是一个使用@Override修饰一个企图重载父类的toString方法,而又存在拼写错误的sample:清单1:@Override public String toSting() { // 注意方法名拼写错了 return "[" + super.toString() + "]";}

    2.不理解标记接口

    https://www.cnblogs.com/yanggb/p/10664155.html

    明天要学习的内容:

    异常机制概述

  • 相关阅读:
    SQL中的数据库设计三范式
    SQL中的DBA命令
    SQL中的视图
    SQL中的索引
    十大程序员必逛网站
    解放双手!你不知道的代码生成神器
    IT体系的演变
    Nginx的六种负载均衡策略
    前端Chrome调试小技巧汇总
    spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)
  • 原文地址:https://www.cnblogs.com/ltw222/p/13395965.html
Copyright © 2011-2022 走看看