Java final与泛型详细解析

 更新时间:2025年11月07日 10:33:38   作者:芝士汉堡猫  
文章主要介绍了Java中的final关键字、泛型以及包装类,final关键字用于确保变量、方法和类不会被修改,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、final关键字

为什么会有final关键字?答:确保它们不会在子类中改变语义。

特点:

(1)修饰常量:必须赋值的操作,且只能被赋值一次,之后不可修改;

a.当final修饰属性时(必须手动赋值,系统不会自动赋值):

·所有对象共同用一个常量时--可显示初始化赋值,可代码块中初始化;

·当每个对象使用不同值时->可以构造器中初始化。

b.当final修饰局部变量时:

·由final修饰变量只可复制一次,所以final修饰形参后,调用方法给常量实参后,在方法体内不可重新赋值;

c.当final修饰引用类型变量时:

·不可以赋予其新对象(新地址),但是对象中的内部信息可以更改。

(2)修饰方法:final修饰的方法不能被重写;

(3)修饰类:final修饰的类不能被继承,String就是final修饰的类。

(4)static final修饰属性->全局常量

·声明在方法区中,可以节省空间,无需使创建一次对象新建一次

二、泛型<>——泛指一切类型

相关知识:栈是一种满足数据先进后出的数据结构。

示例代码:
//入栈操作↓
void push(int value){
    top++;
    arr[top]=value;
}
//出栈操作↓
void pop(){
    println(arr[top]);
    top--;
}

关于链表的删除:计算机中没有真正意义上的删除,只需原来指向某一对象对应地址的指针跳过该对象,此对象不被使用之后就会被回收,完成链表的“删除”。

public class Stack<哈基米>{
    private 哈基米 arr[];
    private int top;
    public Stack(int size){
    arr=(哈基米[])new Object[size];//强转换
    top=-1;
}
public void push(哈基米 value){
    if(top==arr.length-1){
        System.out.println("栈已满")
        return;
       }
     arr[++top]=value;
}
public void pop(){
    if(top==-1){
    System.out.println("栈已空");
    return;
    }
}
System.out.println(arr[top--]);
}

概念:泛型就是把“类型”当成“参数”来传,一份代码能适用多种类型。

public static void main(String[] args){
//整形
Stack<Integer> stack=new Stack<>(size:10);
    stack.push(value:1);
    stack.push(value:2);
    stack.push(value:3);
    stack.push(value:4);
    stack.pop();
    stack.pop();
//字符串
Stack<String>stack1=new Stack<>(size:10);
    stack1.push(value:"张三");
    stack1.push(value:"李四");
    stack1.push(value:"王五");
    stack1.pop();
    stack1.pop();
//浮点型
Stack<Double> stack2=new Stack<>(size:10);
    stack2.push(value:1.1);
    stack2.push(value:1.1);
    stack2.pop();
}
}
//输出为 4
        3
        2
        王五
        李四
        2.2

三、包装类

Java说万物皆对象,为什么有包装类?

答:基本数据类型不能有对象属性,基本数据类型不能方法的调用。

基本数据类型对应的包装类:

基本数据类型intdoublebooleancharlongfloatshort
包装类IntegerDoubleBooleanCharacterLongFloatShort

面试题:128陷阱

public static Integer valueOf(int i){
    if(i>=IntegerCache.low&&i<=IntegerCache.high)
    return IntegerCache.cache[i+(-IntegerCache.low)];
    return new Integer(i);
}
Integer i=127;
Integer j=127;
System.out.println(i==j);//true
Integer k=128;
Integer l=128;
System.out.println(k==l);//false

包装类的自动拆装箱:因为有自动拆装箱的存在,所以包装定义的数据和基本数据类型可以相互转换。

i、j、k、l在内存图中的具体表现是如何的呢?

堆内存中有Cache数组(-128~127),首先main方法入栈,i入参127在-128~127之间,则返回了127的地址值,同理,j入参127在-128~127之间,则返回了127的地址值,它们指向同一个地址,所以返回true。而k和l呢?k入参了128,并不在-128~127之间,所以会重新创建了新对象,返回新的地址,l入参了128,并不在-128~127之间,所以会重新创建了新对象,返回新的地址,但是它们创建的新地址并不相同,所以返回false。

总结:我们使用Integer定义的数据会自动进行装箱,自动装箱调用valueOf()方法,该方法会判断我们入参是否在-128~127之间,如果爱这之间,则会返回一个已存在的对象的地址(该对象在Cache数组中,Cache数组是一个从-128~127的数组),则不会创建新对象,反之则重新创建对象。

自动装箱:基本数据类型->包装类

自动拆箱:包装类->基本数据类型

基本数据类型和引用数据类型用==做输出的时候会自动拆装箱,例如Integer型和int型做==输出会自动拆箱到int型,两个数比较数值,相同则返回true,反之则返回false。但是两个相同数据类型的则不会进行自动拆装箱,例如Integer和Integer进行==输出。

到此这篇关于Java final与泛型详细解析的文章就介绍到这了,更多相关Java final与泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JDK1.8使用的垃圾回收器和执行GC的时长以及GC的频率方式

    JDK1.8使用的垃圾回收器和执行GC的时长以及GC的频率方式

    这篇文章主要介绍了JDK1.8使用的垃圾回收器和执行GC的时长以及GC的频率方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • spring与mybatis整合配置文件

    spring与mybatis整合配置文件

    本文通过实例代码给大家介绍了spring与mybatis整合配置文件的方法,需要的朋友参考下吧
    2017-09-09
  • 完全解析Java编程中finally语句的执行原理

    完全解析Java编程中finally语句的执行原理

    这篇文章主要深度介绍了Java编程中finally语句的执行原理,细致讲解了finally在异常处理中的流程控制作用,需要的朋友可以参考下
    2015-11-11
  • 面试官问如何启动Java 线程

    面试官问如何启动Java 线程

    这篇文章主要介绍了面试官问如何启动Java 线程,Java 的线程创建和启动非常简单,但如果问一个线程是怎么启动起来的往往并不清楚,甚至不知道为什么启动时是调用start(),而不是调用run()方法呢?下面我们就一起进入文章学习这个问题吧
    2021-12-12
  • Java计算对象大小的方法详解

    Java计算对象大小的方法详解

    在Java应用程序的性能优化场景中,时常需要考虑Java对象的大小,以便观测,本文为大家介绍了常用的Java计算对象大小的方法,感兴趣的可以了解下
    2025-01-01
  • 一不小心就让Java开发踩坑的fail-fast是个什么鬼?(推荐)

    一不小心就让Java开发踩坑的fail-fast是个什么鬼?(推荐)

    这篇文章主要介绍了Java fail-fast,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • MyBatis关闭一级缓存的两种方式(分注解和xml两种方式)

    MyBatis关闭一级缓存的两种方式(分注解和xml两种方式)

    这篇文章主要介绍了MyBatis关闭一级缓存的两种方式(分注解和xml两种方式),mybatis默认开启一级缓存,执行2次相同sql,但是第一次查询sql结果会加工处理这个时候需要关闭一级缓存,本文给大家详细讲解需要的朋友可以参考下
    2022-11-11
  • Java中Map接口使用以及有关集合的面试知识点汇总

    Java中Map接口使用以及有关集合的面试知识点汇总

    在java面试过程中,Map时常会被作为一个面试点来问,下面这篇文章主要给大家介绍了关于Java中Map接口使用以及有关集合的面试知识点汇总的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Spring的Eureka续约(心跳检测)详解

    Spring的Eureka续约(心跳检测)详解

    这篇文章主要介绍了Spring的Eureka续约(心跳检测)详解,eureka client每隔一定的时间,会给eureka server发送心跳,保持心跳,让eureka server知道自己还活着,需要的朋友可以参考下
    2023-11-11
  • java将m3u8格式转成视频文件的方法

    java将m3u8格式转成视频文件的方法

    这篇文章主要介绍了如何java将m3u8格式转成视频文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论