Java八股文——重载+泛型(一)

面向对象

重载

JVM在重载方法中,选择合适的目标方法的顺序如下:

  1. 精确匹配
  2. 如果是基本数据类型,则转换成更大表示范围的基本类型
  3. 通过自动装箱与拆箱
  4. 通过子类向上转型继承路线依次匹配
  5. 通过可变参数匹配

泛型

泛型可以定义在类,接口和方法中。

E代表Element,用于集合中的元素;T表示某个类;K代表Key,V代表Value,用于键值对元素。

  1. 尖括号里的每个元素都指代一种未知类型。即使是String出现在尖括号里面就不是java.lang,String了,而仅仅是一个代号。类名后方定义的泛型和方法前定义的是两个指代,可以完全不同。
  2. 尖括号的位置必须在类名之后或方法返回值之前。
  3. 泛型在定义处只具备执行Object方法的能力,可以强制转型。
  4. 编译后的字节码指令,会有类型擦除(将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型))。
  5. 泛型指示的都是Object(在使用的时候都是以Object来处理的,包括使用的方法啥的)。除非使用了后面的<? extends T>,那么由于传入的是T以及T的子类,所以可以用T类中的方法。

好处:

  1. 类型安全。放置的是什么,取出来的就是什么,不会有ClassCastException
  2. 提升可读性。
  3. 代码重用

在类中的应用

public class GenericsDemo06 {
    public static void main(String[] args) {
        Point<String> p = new Point<>();
        p.setVar("it");
        System.out.println(p.getVar().length());
    }
}

class Point<T> {
    private T var;
    public T getVar() {
        return var;
    }
    public void setVar(T var) {
        this.var = var;
    }
}

在接口中的应用

public class GenericsDemo24 {
    public static void main(String[] args) {
        Info<String> i = new InfoImpl<>("Tom");
        System.out.println(i.getVar());
    }
}

interface Info<T> {
    T getVar();
}

class InfoImpl<T> implements Info<T> {
    private T var;
    public InfoImpl(T var) {
        this.var = var;
    }
    public void setVar(T var) {
        this.var = var;
    }
    @Override
    public T getVar() {
        return null;
    }
}

在方法中的应用

泛型方法,是在调用方法的时候指明泛型的具体类型。

定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。

为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。

在集合的应用

List<?>是一个泛型,在没有赋值前,表示它可以接受任何类型的集合的赋值,赋值之后就不能随便往里添加元素了,但是可以删除和清除元素。

Collection是最顶层的接口,如果参数是泛型限制的集合(Collection),可以接受非泛型和泛型的集合(List等一系列继承自Collection的接口)。当然如果一个类实现了List等接口也是可以传入的,因为反正里面也是调用这个接口的方法,那么实现了继承自Collection的接口的类也一定有对应的方法。

如下:

public boolean addAll(Collection<? extends E> c) {...}

可以接受JSONArray,因为:

public final class JSONArray extends AbstractJSOn implements JSON, List {}

ps:可以将Integer[]赋值给Object[],但是不能将List<Integer>赋值给List<objetc>

原因:数组是协变的,所以可以将子类型数组赋值给超类型数组。但是泛型类型是不变的,所以不能将子类赋值给超类型泛型。(简单理解就是:声明的时候,指定List<Object>后,中的T就是Object了,由于泛型是不变的,所以不能将T赋值成Integer)。编译时类型检查,因为如果是可变的,那么将List<Object>改为指向List<Integer>,就有可能会添加不是Integer类型的元素。

  • 问号在正则表达式中可以匹配任何字符,List<?>称为通配符集合,可以接受任何类型的集合引用赋值,不能添加任何元素,可以remove和clear。

    List<Integer> a3 = new ArrayList<>();
    List<?> a4 = a3;
    

    List<?>一般用作参数来接收外部的集合,或者返回一个不知道具体元素类型的集合。

  • <? extends T>适用于消费集合元素为主的场景。(Get First)

    可以给赋值(=)任何T以及T子类的集合,上界为T,取出来的类型会向上强制转型为T

    null 可以表示任何类型,所以除null外,任何元素都不得添加<? extends T>集合内。

    可以返回(get)带类型的元素,但是只能返回T以及T父类对象。(因为能保证上限是T,返回T及父类不会有问题)

  • <? super T>适用于生产集合元素为主的场景。(Put First)

    可以给赋值(=)任何任何T以及T的父类集合,下界为T。

    可以添加(add)元素,但是只能添加T以及T的子类集合。(因为只能保证最低是T,所以不能添加T以上的,只能添加T及T以下的)

    可以返回(get)元素,但是泛型丢失,只会返回Object

注意:如果T是一个接口,那么这里还可以指 实现了T的父类或子类接口的实现类

如下:这里的意思是实现了Comparable或则其子类这个接口的类E,而不是单纯指E是个接口。

    private <E extends Comparable<? super E>> E max(List<? extends E> e1) {
        if (e1 == null) {
            return null;
        }
        Iterator<? extends E> iterator = e1.iterator();
        E result = iterator.next();
        while (iterator.hasNext()) {
            E next = iterator.next();
            if (next.compareTo(result) > 0) {
                result = next;
            }
        }
        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 对于Java面试的典问题,可以组织成一份带目录的PDF,以便应聘者进行准备。以下是一个例子(目录中的题目和内容可能会有所变化): 目录: 第一章:Java基础 1.1 变量和数据类 1.2 控制流程 1.3 数组和集合 1.4 面向对象编程 1.5 异常处理 第二章:Java核心特性 2.1 封装、继承和多态 2.2 接口和抽象类 2.3 内部类和匿名类 2.4 2.5 反射 第三章:Java高级特性 3.1 线程和并发 3.2 文件操作和IO 3.3 序列化和反序列化 3.4 JDBC和数据库操作 3.5 注解 第四章:Java框架和工具 4.1 JavaEE和Spring框架 4.2 ORM框架(如Hibernate) 4.3 Web开发(如Servlet和JSP) 4.4 单元测试(如JUnit) 第五章:常见面试题 5.1 字符串操作 5.2 集合操作 5.3 算法问题 5.4 设计模式 5.5 性能调优 这份带目录的PDF涵盖了Java面试中常见的问题和主题,从Java基础和核心特性到高级特性、框架和工具,再到常见面试题。应聘者可以根据自己的需求选择性阅读和准备这些题目。 当然,由于Java面试题的广性和多样性,上述目录仅供参考,并不能囊括所有的重点和面试题。应聘者在准备时还需要结合自身经验和岗位要求进行更细致的准备。同时,除了看题目,还需要通过实际练习和项目经验来提升自己的技能,以便更好地应对Java面试。 ### 回答2: Java八股文是指在Java面试中经常会遇到的常见问题和题目,通常包含了面试者对Java编程语言的掌握程度和开发经验的考察。Java八股文面试题PDF带目录是指将这些问题整理成PDF文档,并按照不同的主题和难度进行分类,提供目录方便阅读和学习。 这样的PDF文档通常包括大量的Java基础知识问题,涉及数据类、运算符、控制流、数组、字符串等内容。同时也包括了面向对象的概念和原则,如封装、继承、多态、抽象类和接口等。还会涉及到Java集合框架、异常处理、多线程编程、IO操作、数据库连接等进阶话题。此外,还可能包括了一些关于Java开发工具和常用框架的问题,如Maven、Spring、Hibernate等。 一个好的Java八股文面试题PDF带目录应该具备以下特点:准确性,题目的设计需要准确反映出Java编程的特点和难点;完整性,尽可能地涵盖Java编程的各个方面;分类明确,按照主题和难度进行分类,方便面试者自行选择学习和深入;解析详细,每个问题都需要提供详细的解析和答案,帮助面试者理解和掌握问题的解决思路。 总之,Java八股文面试题PDF带目录是一份全面、系统、高效的Java面试指南,可以帮助面试者全面了解和掌握Java编程知识,提高面试的准备水平,增加面试的成功率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值