[JAVA学习笔记] 21天学习挑战赛第二周 面向对象编程(四)接口与泛型

​写在前面

本文主要讲解了Java中接口与泛型机制,一起来领悟Java的多重实现与参数化的魅力吧。

活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…

接口

定义

接口是抽象类的延伸,在1.8之前,接口与抽象类一样,不允许有具体的方法实现,在1.8之后为接口增加了改进,允许接口中存在默认的方法实现,默认方法的关键字使用default和static关键字修饰。

接口使用interface关键字定义,格式如下:

[public] interface 接口名 [extends 父接口名列表]{

        [public] [static] [final] 域类型 域名 = 常量值;

        修饰符 返回值 方法名();

        [default|static] 返回值 方法名(){

                //TODO...

        }

}

Tips

接口中,方法必须被public和abstract(1.8后新增default与static)修饰

接口中任何字段都是static和final的。

一个类通过使用implements关键字实现接口。

接口的用途

接口定义了一套行为规范,一个类实现该接口便要遵守这个接口所定义的规范——实现接口中定义的所有抽象方法,有一个抽象方法未实现,该类便只能是抽象类。

接口的多重实现机制很大程度上弥补了java类的单重继承的局限性,不仅一个类可以实现多个接口,而且多个无关类可以实现同一个接口。

接口的实现注意事项 

  • 一个类可以实现多个接口,在声明时用implements关键字声明该类将要实现哪些接口,多个接口之间使用逗号隔开;
  • 如果实现某接口的类不是抽象类,则在类的定义部分必须实现指定接口的所有抽象方法;
  • 一个类实现某接口的抽象方法时,必须重写该方法;
  • 接口的抽象方法都是访问限制符默认为public,在实现方法时要显示加上public修饰符。

泛型

定义

泛型是Java语言的新特性,泛型本质上是参数化类型——程序中的数据类型被指定为一个参数。泛型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

例如

public class Example<T>{
    private T obj;

    public Example(T obj){
        this.obj = obj;
    }

    public T getObj(){
        return obj;
    }

    public void showType(){
        System.out.println("T的实际类型是:" + obj.getClass().getName());
    }

}

意义

在1.5之前,Java不支持泛型,为实现方法参数的通用性,一般将参数定义为Object类型,任意对象都可以传递给Object类型引用变量,从而实现参数的“任意化”,但是,要将对象转化为原有类型就必须强制类型转换,容易带来问题。(Object是万类之祖,非必要不要声明Object类型的参数;需要使用的参数类型一般是有限的)

好处

泛型在定义的时候不指定参数的类型,在使用的时候确定,增加了程序的通用性,使程序更为“模板”化;

在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的。

使用规则

  • 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型(基本数据类型需要使用对应的封装类);
  • 泛型的类型参数可以有多个,例如Map<K,V>;
  • 泛型的参数类型可以使用extends语句,例如<T extends Number>,extends在这里并非是继承的意思,而是表示类型上界限制,代表着T<=Number;
  • 泛型的参数类型可以是通配符类型,ArrayList<? extends Number>,表示Number范围的某个类型,其中,“?”代表着未定类型;
  • 泛型的参数类型还支持super子句,<? super T>表示类型的下界限制,表示参数化类型是T或T的父类型。

Tip:集合类大部分都是泛型类,关于集合类博主以后会介绍,敬请期待。 

泛型方法

特点

Java允许有泛型方法,即某个方法的参数是参数化的,参数的实际类型取决于实参,泛型方法与其类是否是泛型没有关系。

格式

public class Example{

        public <T> void getObj(T x){

                System.out.println(x.getClass().getName());

        }

}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸海鹿林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值