Java笔经1:泛型,IO体系,异常,关于System类

CLR底层原理:JIT实例化、约束验证与协变机制解析 是.NET系统的核心机制,其本质并非语法糖,而是由CLR在运行时严格保障的契约。理解需从IL元数据结构出发,掌握JIT如何为值和引用分别生成专用机器码,以及`where T : class/struct`等约束如何直接影响内存布局与方法分发路径。协变与逆变并非转换,而是CLR对虚表调用链的拓扑重写,仅适用于接口和委托。技术价值体现在性能优化(如避免装箱)、内存控制(栈/堆分离)与安全强化;典应用场景包括高性能集合库开发、DI容器服务解析、序列化框架适配及AOT预编译 阅读详情

注:这是本人笔试期间总结的一些java知识点,太简单的没写,太深奥的疏漏较多,主要是针对较难易错点的的一些探讨,错误之处还望留言斧正。

一、泛型

1、一个简单的泛型类

  • 注意<T>的位置,T可以是任意的字母,常用的有K、V、T、S、U等,多个类型变量变量可以用逗号分割Pair<T, K, V>
class Pair<T> {
    private T min;
    public Pair() {
        this.min = null;
    }
    public Pair(T min) {
        this.min = min;
    }
    public T getMin() {
        return min;
    }
    public void setMin(T min) {
        this.min = min;
    }
}

2、泛型方法

  • 下边是一个简单的泛型方法,注意类型变量(<T>)放在修饰符的后边(public、static),在返回值类型前边(T)。
public static <T> T getMiddle(T... ts) {
    return ts[ts.length / 2];
}
  • 对此方法的调用也有两种形式,一种指定类型变量,另一种编译器可以根据参数推断
ArrayAlg.<Integer>getMiddle(1, 2);
ArrayAlg.getMiddle(1, 2);
  • 当没有指定类型变量,并且根据参数推断时发现不是同一种类型,会继续向上推断,直至找到共同的父类,这个父类就是推断出来的类型变量了,如下,第一行推断结果为Number,第二行为Object
Number n = ArrayAlg.getMiddle(1, 2, 2.2);
Object o = ArrayAlg.getMiddle(1, 2.2, "hello");

3、泛型变量限定

  • 为什么要限定泛型变量?如果在方法中需要调用T类型的对象的一个方法,但是这个方法有的类有有的类没有,那么就限制这个类型变量必须是指定有这个方法的子类,包括继承和实现接口,如下将T类型变量限制为实现Comparable接口的类,这样就可以调T类型变量的compareTo()方法而不会报错了。
public static <T extends Comparable<T>> T min(T[] ts) {
    if (ts == null || ts.length == 0)
        return null;
    T min = null;
    for (T t : ts)
        min = min.compareTo(t) > 0 ? t : min;
    return min;
}
  • 语法为<T extends BoundingType>,接口和继承都用extends,多限制可以用&分割<T extends BoundingType1 & BoundingType2>

4、泛型代码和虚拟机

  • 编译的时候类型参数会被擦除掉,替换为限定的类型,没有限定类型的话替换为Object,注意:限定类型是指<T extends BoundingType>中的BoundingType,而不是实例化时像List<String>中的String
  • 如果有多个限定,会选择第一个限定作为擦除后的替换,例如在上边的例子中将类型限定改为<T extends Comparable & Serializable>,将会采用Comparable来替换T,但是如果写成<T extends Serializable & Comparable>,将会使用Serializable来替换T,但是之后的代码中会执行compareTo()方法,编译器就要做必要的类型转化了,所以为了提高效率,应将标签接口(没有方法的接口)放到边界列表的末尾(边界列表就是指上边的多个类型限定)
  • 在擦除的的时候会有一些必要的强制类型转化,其中脉络比较复杂,也牵扯了泛型的核心,这里不展开说明了。

5、通配符

  • 用如下代码讲解通配符的作用和简单用法
public class Main {
    public static void main(String[] args) {
        Utils.printEmployee(new Pair(new Manager("Job"), new Manager("Ketty")));
    }
}

class Utils {
    // 方法一:不能接收Manager
    public static void printEmployee(Pair<Employee> e) {
        System.out.println("first:" + e.getFirst().getName());
        System.out.println("second:" + e.getSeconde().getName());
    }

    // 方法二:能接收Manager
    public static void printEmployee(Pair<? extends Employee> e) {
        System.out.println("first:" + e.getFirst().getName());
        System.out.println("second:" + e.getSeconde().getName());
    }
}

class Pair<T> {
    private T first;
    private T seconde;

    public Pair(T first, T second) {
        this.first = first;
        this.seconde = second;
    }
    // getter and setter...
}

class Employee {
    private String name;
    public Employee(String name) {
        this.name = name;
    }
    // getter and setter...
}
class Manager extends Employee {
    private int rank;
    public Manager(String name) {
        super(name);
    }
    // getter and setter...
}
  • Manager继承自Employee,工具类中有一个方法printEmployee()希望可以去打印Pair类中存放的两个Employee的name信息,自然也可以想到,Manager继承自Employee,那么应该也可以打印Manager的name信息
  • 那么明确一点Pair<Manager>不是Pair<Employee>的子类,而且他们没有任何关系
  • 那么问题来了根据上一点说的,Pair<Manager>不是Pair<Employee>的子类,那方法一 printEmployee(Pair<Employee> e) 也就没法接收Pair<Manager>类型的参数,那么main方法中的调用也就自然而然报错,这就不符合我们自然的想法了,很不舒服,怎么解决呢?用通配符。
  • 方法二 printEmployee(Pair<? extends Employee> e) 需要的参数是Pair<? extends Employee>类型,而Pair<Manager>是其子类,所以可以成功。

二、Java的IO结构

1、InputStream、OutputStream、Reader、Writer常用类继承类图

2、比较

  • InputStream 和 OutputStream用于字节的操作,Writer 和 Reader用于字符操作,File和RandomAccessFile用于磁盘操作,Socket用于网络操作

三、异常体系

1、异常继承类图

2、Error和Exception

  • Error程序无法处理,JVM一般会选择将线程终,而Exception是需要程序去处理的,又可以分为

3、运行时异常和非运行时异常

  • RuntimeException类及其子类为运行时异常,不需要程序处理
  • Exception中出除去RuntimeException剩下的都是非运行时异常,还有用户自定义的异常也是非运行时异常,需要捕获或者抛出处理

4、try、catch、finally

public class Main {
    public static void main(String[] args) {
        System.out.println(test02());
    }
    public static int test02() {
        int[] nums = new int[] {1,2};
        try {
            System.out.println("try...");
            System.out.println(nums[1]);
            // System.out.println(nums[2]);
            return 0;
        } catch (Exception e) {
            System.out.println("catch...");
            return 1;
        }finally {
            System.out.println("finally...");
            return 2;
        }
    }
}
  • 以上代码是一个比较经典的异常返回的例子,如果在try、catch、finally中都做return,到底谁有效,分别访问nums数组的第1个和第2个元素,形成有异常和没有异常两种情况,发现main方法中打印的分别是2和1,没有0,说明最后一个return起作用

5、catch匹配

  • 多个catch存在时,按顺序进行匹配,匹配到之后执行此catch块,并且只执行这一个catch块

6、throw和throws

  • throw用于方法内部抛出一个异常,注意是一个,没用复数就可以看出来
  • throws用于方法抛出异常,方法可能抛出多种异常,用复数

四、System类

  • System类中所有的属性都是静态的
  • public static void exit(int status)  系统退出 ,如果status为0就表示退出
  • public static void arraycopy(Object src,int srcPos, Object dest,int desPos,int length) 数组拷贝操作,如果是数组比较大,那么使用此方法是非常有效的,因为其使用的是内存复制,省去了大量的数组寻址访问等时间。Arrays有个方法copyOf(),其内部也是用arraycopy()实现的,源码如下
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    @SuppressWarnings("unchecked")
    T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] :(T[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
    return copy;
}
  • public static void gc()   运行垃圾收集机制,调用的是Runtime类中的gc方法
public static Runtime getRuntime() {
    return currentRuntime;
}
  • public static Properties getProperties() 取得当前系统的全部属性
13.异常System、BigDecimal、Date 第十三天 文章目录第十三天1. 异常1.1 Throwable1.2 Exception1.3 异常声明的注意事项:继承1.4 异常的捕获1.5 Finally关键字1.6 自定义异常2. System3. BigDecimal3.1 BigInteger3.2 BigDecimal4. Date4.1 第一阶段4.2第三阶段Today Code 1. 异常 定义:程序出现非正常的情况,导致JVM停止工作 处理异常:针对程序中出现的不同异常给出不同的解决方案,从而让程序正常运行,保证JVM 阅读详情

相关推荐

阿里云大模 ACP 认证教材内容突变?这些改动藏着通关密码,不看亏大!

【摘要】核心章节大换血,安全合规融入实战场景,大模微调用数学深度解析,部署章节带来阿里云产品对比实战攻略,甚至整章内容被替换成藏满学习彩蛋的行业趋势指南。这些改动不仅重塑考试重点,更暗藏官方命题风向——安全合规考场景方案,微调原理考几何解析,部署设计考分析框架。无论你是数学小白还是部署新手,这篇攻略都将带你吃透变动逻辑,附赠急救包和考点清单,帮你抓住这些“隐形加分项”,速来解锁通关秘籍!

davidkorhenn的博客 1716

Java IO操作——SystemIO的支持(System.out、System.err、System.in)

学习目标  掌握SystemIO的三种支持:     System.out     System.err     System.in 掌握System.out及System.err的区别 掌握输入、输出重定向 System的常量 System表示系统,实际上在JAVA中也对IO给予了一定的支持 1、public static final PrintStream ou

5926

AD5700 HART芯片实战记:从时钟检测到数据收发,一个STM32工程师的踩坑实录

本文详细记录了STM32工程师在AD5700 HART芯片开发中的实战经验,涵盖时钟信号检测、RTS切换时序优化及HART数据解析等关键问题。通过硬件设计检查、定时器配置优化和大小端转换方案对比,解决了工业级芯片开发中的典挑战,为嵌入式开发者提供宝贵参考。

weixin_42715608的博客 141

Java基础知识(二)(Object的常用方法、日期时间System、StringBuilder、包装、Collection集合、Iterator迭代器、、list集Set接口...)

1.Object的常用方法2.日期时间3.System4.StringBuilder5.包装6.Collection集合7.Iterator迭代器8.9.list集合10.List的子11.Set接口12.Collections常用功能13.Map14.异常15.多线程16.线程安全16.2.2 同步方法17.线程的状态18.等待唤醒机制19.线程池20.Lambda表达式21.File22.递归23.IO概述24.字节流25.字符流26.IO异常的处理27.属性集28.缓冲流转换流

yabayaoya的博客 1106

记整理4----Java语言高级(四)16 JAVA常用API-高级+17 与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级

16 JAVA常用API-高级+17 与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级 第05天 API 今日内容介绍  Object &amp;amp;amp;amp; System  日期相关  包装&amp;amp;amp;amp;正则表达式 第1章Object &amp;amp;amp;amp; System 1.1Object 1.1.1概述 ObjectJava语言中的根,即所有的父。它中描述

javadamn的博客 590

集合API异常IO

1.Objectjava语言中的根,即所有的父2.System包含一些有用的字段和方法,它不能被实例化3.static void arrayCopy(Object src1,int index1,Object src2,int index2.int length) 复制数组(源数组,源数组的起始索引位置,目标数组,目标数组的起始索引位置,指定接受的元素个数)4.Date...

aochu5942的博客 147

Java学习总结:48(SystemIO的支持)

SystemIO的支持 SystemIO有关的3个对象常量 No. 常量 描述 1 public static final PrintStream err 常量 显示器上错误显示 2 public static final PrintStream out 常量 显示器上信息输出 3 public static final IntputStream in 常量 ...

小关同学的博客 222

12.8 SystemIO的支持(血干JAVA系列)

System表示系统,此在之前讲解Java常用库时己经介绍过,实际上在JavaSystem也对IO给 予 了 一 定 的 支 持 , 在 S y s t e m 中 定 义 了 如 表 1 2 - 1 1 所 示的3个常量,这3个常量在IO操作中有着非常大的作用。

qq_52384627的博客 808

java IO

Java的核心库java.io提供了全面的IO接口,包括:文件读写、标准设备输出等。JavaIO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。 在项目开发中,IO是非常基础的部分,在面试当中经常出现。 对于初学者而言,IO部分是容易忽略的内容,求职者一定要掌握该知识点10.3.1  了解JavaIO 面试例题28:下面关于System.out的说...

sw249009188的专栏 251

黑马程序员——7.1.IO(其他对象API(System、Runtime、Math、Date)字节流与字符流、IO异常处理、缓冲区、键盘录入、转换流、异常日志、流的操作总结)

Java IO(其他对象API(System、Runtime、Math、Date)字节流与字符流、IO异常处理、缓冲区、键盘录入、转换流、异常日志、流的操作总结)

u012126525的专栏 606

Day16_IO框架1(File, IO流, 字节流字符流, IO异常, Properties)

文章目录一. File1.1 概述1.2 File的静态成员变量1.3 路径绝对路径相对路径1.4 构造方法1.5 常用方法获取功能的方法判断功能的方法创建删除功能的方法遍历目录的方法【例】打印多级目录 (递归)【例】文件搜索1.6 FileFilter接口【例】文件搜索(FileFilter优化)【例】补充:文件搜索(Lambda优化)二. IO流的概念2.1 什么是IO?2.2 什么是流?2.3 流的分输入流 和 输出流字节流 和 字符流节点流 和 处理流三. 字节流3.1 字节流的父:3.2

不愿透露姓名的马建国的博客 1254

Java基础教程】(四十六)IO篇 · 下:SystemIO的支持:错误输出、信息输出、系统输入,字符缓冲流、扫描流和对象序列化流~

在本文中,我们详细探讨了JavaSystemIO操作的支持,以及字符缓冲流、扫描流和对象序列化流的应用。首先,我们了解到System提供了三个重要的I/O流:错误输出(System.err)、信息输出(System.out)和系统输入(System.in通过这些流,我们可以方便地处理错误信息、输出结果和用户输入。接下来,我们研究了字符缓冲流(),它提供了高效读取文本数据的能力。通过使用缓冲机制,字符缓冲流可以减少磁盘或网络读取的次数,从而提高性能。我们还讨论了扫描流(Scanner...

Technology changes the world of life 1107

Java SystemidentityHashCode()方法及示例

系统identityHashCode()方法 (System class identityHashCode() method) identityHashCode() method is available in java.lang package. identityHashCode()方法在java.lang包中可用。 identityHashCode() method is used t...

cumt951045的博客 3398

java基础

接⼝的⽅法默认是 public ,所有⽅法在接⼝中不能有实现(Java 8 开始接⼝⽅法可以有默认实现),⽽抽象可以有⾮抽象的⽅法。接⼝中除了 static 、 final 变量,不能有其他变量,⽽抽象中则不⼀定。⼀个可以实现多个接⼝,但只能实现⼀个抽象。接⼝⾃⼰本身可以通过 extends 关键字扩展多个接⼝。

qq_62911742的博客 1058

java system.io_谈谈Java-IO SystemIO的三种支持

以下是本人的一些分享,我热爱编程,希望能多交编程的爱好者,如果你也是其中一名,那么请加好友,大家关注一下,下面的文章是自己觉得一些有用的东西,留下来给自己当记,当然也希望能帮助到你,首先感谢你的阅读~!Java-IO SystemIO的支持SystemIO的三种支持:System.outSystem.errSystem.in1System.out使用System.out输出的时候就是将输出...

weixin_42522167的博客 200

Java入门到精通-23 ——安全的参数化编程

本文介绍了Java的概念及其应用,主要内容包括: 为什么需要 展示了未使用时存在的安全问题 列举的四大优势:安全、消除强制转换、代码复用和文档化 的使用 单参数示例(Box) 多参数示例(Pair) 实际应用:通用API响应(ApiResponse) 的继承方式 接口 基本接口实现(Comparator) 实际应用:DAO模式 文章通过代码示例展示了如何提高安全性并简化代码,适用于Java 5及以上版本。Java实现参数化编程的

weixin_56693899的博客 255

JAVA SE学习记(七):终章:Java程序设计基础记(全10万字)

Java程序设计入门 ​ copyright © 2020 by 宇智波Akali 目录 文章目录第1Java基础语法1、数据​​1.1 八种基本数据1....

宇智波Akali的博客 2万+

Java 常用 10. Java System

主要用于获取系统的属性数据和其他操作,构造方法(私有的)实际上 System 是一些与系统相关属性和方法的集合,而且在System 中所有的属性,都是静态的,要想引用这些属性和方法,直接使用 System 调用即可。方法名说明复制数组获取当前系统时间,返回毫秒值 (常用来计算一个程序执行时间)建议 jvm 赶快启动垃圾回收期器回收垃圾退出 jvm 如果参数是 0 表示正常退出 jvm 非 0 表示异常退出确定当前的系统属性。获取系统某一属性。key - 系统属性的名称。

caihuayuan5的博客 893

科技中介如何高效匹配技术供需?.docx

科技中介如何高效匹配技术供需?

基于STM32的LoRa无线通信

基于STM32的LoRa无线通信,无线芯片为SX1276,SX1278,特别经过安信可公司的LoRa芯片Ra-01、Ra02测试通过。单片机为STM32F103VeT6,其他系列也有一定参考价值。内附收发程序,数据手册,引脚连接等

上一篇: Java笔经0:基本数据类型,访问修饰符,多态,构造器
下一篇: 用maven下载jar包:java初学者必备
DragonFreedom
博客等级 码龄10年 10粉丝 23原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值