码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java学习笔记(二十)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第二十篇博客。

    本篇博客介绍了Java的泛型。

    本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11。

    目录

    泛型

    泛型概述和好处

    泛型类

    泛型方法

    泛型接口

    类型通配符

    可变参数

    可变参数的使用


    泛型

    泛型概述和好处

    泛型是JDK5引入的特性,提供了编译时类型安全检测机制,该机制允许在编译时检测到非法类型。泛型的本质是参数化类型,操作的数据类型被指定为一个参数。参数化类型就是将类型参数化,然后在使用的时候传入具体的类型。这种参数类型可以用在类、方法和接口中,分别称为泛型类、泛型方法和泛型接口。

    泛型的定义格式是:

    <类型> 

    指定一种类型的格式,类型可以看作形参。

    <类型1,类型2...>

    指定多种类型的格式,多种类型之间用逗号隔开,类型可以看作形参。

    具体调用的时候给定的类型可以看成实参,实参的类型只能是引用数据类型。

    泛型的好处是将运行期间的问题提前到了编译期间,避免强制类型转换。

    泛型类

    泛型类的定义格式是:

    修饰符 class 类名<类型>{...}

    类型通常用大写字母,如T表示。

    1. public class generic1 {
    2. private T thing;
    3. public generic1(){}
    4. public generic1(T thing){
    5. this.thing = thing;
    6. }
    7. public T getthing(){
    8. return thing;
    9. }
    10. public void setthing(T thing){
    11. this.thing = thing;
    12. }
    13. }

    generic1类是一个泛型类,其成员变量thing为T类型,private权限。并有对应的get和set方法,以及带参构造方法。

    1. public class generictest1 {
    2. public static void main(String[] args){
    3. generic1 g1 = new generic1(10);
    4. System.out.println(g1.getthing());
    5. generic1 g2 = new generic1("Java");
    6. System.out.println(g2.getthing());
    7. generic1 g3 = new generic1(7.14);
    8. System.out.println(g3.getthing());
    9. }
    10. }

    程序建立了三个generic1类对象,并进行了测试。注意如果是基本类型,应该用对应的基本类型包装类。程序的输出是:

    10
    Java
    7.14

    泛型方法

    泛型方法的定义格式是:

    修饰符 <类型> 返回值类型 方法名(类型 变量名){...}

    1. public class generic2 {
    2. public void show(T t){
    3. System.out.println(t);
    4. }
    5. }

    generic2类的成员方法show方法是泛型方法,输出参数。

    1. public class generictest2 {
    2. public static void main(String[] args){
    3. generic2 g1 = new generic2();
    4. g1.show("Java");
    5. generic2 g2 = new generic2();
    6. g2.show(14);
    7. generic2 g3 = new generic2();
    8. g3.show(15.32);
    9. }
    10. }

    程序创建了集合generic2类对象,并调用其show方法。程序的输出是:

    Java
    14
    15.32

    泛型接口

    泛型接口的定义格式是:

    修饰符 interface 接口名<类型>{}

    1. public interface genericinterface {
    2. public void show(T t);
    3. }

    这是一个泛型接口,内有抽象方法show方法。

    1. public class generic3 implements genericinterface{
    2. public void show(T t){
    3. System.out.println(t);
    4. }
    5. }

    generic3类实现了genericinterface接口,重写了show方法。

    1. public class generictest3 {
    2. public static void main(String[] args){
    3. genericinterface g1 = new generic3();
    4. g1.show(7);
    5. genericinterface g2 = new generic3();
    6. g2.show("Java");
    7. genericinterface g3 = new generic3();
    8. g3.show(15.40);
    9. }
    10. }

    此类进行了测试,程序的输出是:

    7
    Java
    15.4

    类型通配符

    为了表示各种泛型List的父类,可以使用类型通配符。List表示元素类型未知的List,元素可以匹配任何的类型。这种带通配符的List仅表示各种泛型List的父类,不能把元素添加到其中。

    如果不希望List是任何泛型List的父类,只希望代表某一类泛型List的父类,可以指定类型通配符的上限。格式是: ,表示后面类型不能比这个类型高。 

    也可以指定类型通配符的下限,格式是,表示后面类型不能比这个低。

    1. import java.util.List;
    2. import java.util.ArrayList;
    3. public class genericall {
    4. public static void main(String[] args){
    5. List list1 = new ArrayList();
    6. List list2 = new ArrayList();
    7. Listextends Number> list3 = new ArrayList();
    8. Listextends Number> list4 = new ArrayList();
    9. Listsuper Integer> list5 = new ArrayList();
    10. Listsuper Number> list6 = new ArrayList();
    11. }
    12. }
    13. 这段代码使用了类型通配符,程序无输出。

      可变参数

      可变参数的参数个数是可变的,用于方法的形参。格式是:

      修饰符 返回值类型 方法名(数据类型...变量名){...}

      这里的变量其实是一个数组,如果一个方法有多个参数,那么可变参数要放在最后。

      1. public class variable1 {
      2. public static void main(String[] args){
      3. System.out.println(sum(10,20,30));
      4. System.out.println(sum(10,20,30,40,50));
      5. System.out.println(sum(10,20,30,40,50,60,70,80,90,100));
      6. System.out.println(sum(495,535,164));
      7. System.out.println(sum(923,165,478));
      8. }
      9. public static int sum(int...num){
      10. int sum = 0;
      11. for(int number:num){
      12. sum += number;
      13. }
      14. return sum;
      15. }
      16. }

      sum方法的参数是可变参数,并返回参数的和。程序的输出是:

      60
      150
      550
      1194
      1566

      可变参数的使用

      Arrays工具类有一个静态方法,public static List asList(T...a) 返回指定数组支持的固定大小的列表。返回的集合不能进行增删操作,但是能进行修改操作。

      List接口有一个静态方法,public static List of(E...elements)返回包含任意数量元素的不可变列表。返回的集合不能进行增删改操作。

      Set接口有一个静态方法,public static Set of(E...elements)返回包含任意数量元素的不可变集合。给元素的时候不能重复。返回的集合不能做增删操作,没有修改的方法。

      1. import java.util.Set;
      2. import java.util.List;
      3. import java.util.Arrays;
      4. public class variable2 {
      5. public static void main(String[] args){
      6. List test1 = Arrays.asList("Hello","world","and","Java");
      7. System.out.println(test1);
      8. List test2 = List.of("Hello","world","and","Java");
      9. System.out.println(test2);
      10. Set test3 = Set.of("Hello","world","and","Java");
      11. System.out.println(test3);
      12. }
      13. }

      程序的输出是:

      [Hello, world, and, Java]
      [Hello, world, and, Java]
      [Hello, world, Java, and]

    14. 相关阅读:
      【老生谈算法】matlab实现小波分析源码——小波分析
      mysql(创建和管理表)
      PHP如何批量修改二维数组中值
      前端开发工具有哪些?17款前端工程师必备工具推荐!
      Linux Vim全面教程
      mongodb
      (JVM)双亲委派机制
      造车新势力“蔚小理”变弱了?不,他们已走过幼年期
      学习笔记——动态路由——RIP(RIP工作原理/防环机制)
      深度学习 精选笔记(4)线性神经网络-交叉熵回归与Softmax 回归
    15. 原文地址:https://blog.csdn.net/m0_71007572/article/details/126385628
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号