没有合适的资源?快使用搜索试试~ 我知道了~
2、你吃麦当劳,在柜台点餐之后不等,出去逛了一圈之后去柜台问问,要是食品做好了,拿走吃 3、你吃麦当劳,在自助点单机点单之后,拿到号,在店内等待叫号 4、你吃麦
资源详情
资源评论
资源推荐
Java 知识点
方法重载,何时用重载,为什么要使用重载?而不是把一个
方法名字换成不同的。
举个例子,我们在一个商场买东西,要去收银台交钱,有三种支付方式:现金、刷卡、
第三方支付,如果一种方式对应一个收银台,这就是把“支付”这个方法换成三个:现金支付
(现金)、刷卡支付(信用卡)、第三方支付(手机)。重载就是无论用哪种支付方式在一个收银台
都可以实现,就等于支付(现金)、支付(信用卡)、支付(手机)。
你觉得哪个比较好?
垃圾回收 GC,什么时候会回收对象,怎么判断这个对象可
以被回收。对象的的几种生存状态。
当对象不存活的时候,对象会被回收。判断对象是否存活,有两种方案,1 是计数器,
2 是可达性。当计数器为 0,表明没有别的对象引用该对象。不过计数器没法解决对象之间
循环引用的问题。可达性分析就是通过 GC Roots 的对象作为起始点往下搜索,当 GC Roots
到某个对象不可达的时候,该对象就是可回收的。
volatile
在多线程情况下,可以禁止指令重排。比如 User user=new User(),这个类初始化步骤
大概是:给 user 分配内存;调用 User 的构造函数初始化;将 user 的对象指向分配好的内存
空间。指令重排简单说就是 JVM 一旦觉得某一步比较耗费时间(比如第二步),就先把第三
步执行了。在单例模式的双重校验锁方法中,这样做就容易出问题,所以要用 volatile 关键
字禁止指令重排。
JVM 类加载
这个真要详细说,一天时间都不够。简单说就是把 java 文件编译好的 class 文件,加载
到内存里,对其进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的 Java 类
型,这就是类加载机制。
类的生命周期:加载、连接(验证、准备、解析)、初始化、使用、卸载。
加载:
1) 通过类的全限定名获取定义此类的二进制字节流。
2) 将字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3) 在内存中生成一个代表这个类的 Class 对象,作为方法区这个类的各种数据的访问
入口。
验证:
1) 文件格式验证
2) 字节码验证
3) 符号引用验证
准备:
举例,public static int value=666;在准备阶段,value 的值是 0,到了初始化阶段才是
666。如果 public static final int value=666;则在准备阶段 value 的值就是 666。
初始化:
在这个阶段主要执行类的构造方法。并且为静态变量赋值为初始值,执行静态块代码。
Java 类只有对类的首次主动引用时才会初始化,主动引用的情况有:
1) new 一个对象。
2) 访问或赋值类或接口的静态变量;调用类的静态方法。(静态变量或静态方法必须
在这个类中,才会初始化这个类,如果在父类中定义,子类去调用,子类不会被初
始化。另外 final 的静态变量如果是确定值的常量,所在类不初始化(不会执行 static
块);如果是不确定值的变量,所在类需要初始化(执行 static 块))
3) 反射
4) 初始化子类时,如父类还没初始化,先初始化父类。(初始化一个类或接口时,父
类必须先初始化,但其所实现的接口不会先初始化)
5) main 方法所在的类。
例 1:
说一下整个的步骤:
1) 在 main 函数中,执行 MyValue.getMyValue()。
2) MyValue 类执行 getMyValue()静态方法,需要初始化 MyValue 类(主动引用)。
3) 按照顺序执行 new MyValue(),也就是 MyValue 的构造函数,value1 和 value2 没有
初始化的值都是 0,++之后都是 1。
4) 继续执行后面的两行,其中 value1 没有赋值,还是 1;value2 赋值了,由 1 变为
0。
5) main 函数打印 value1、value2 分别是 1,0。
改一下,将 new MyValue 这一行挪到两个赋值语句的下面,执行结果就变成了 1,1。原
因就是先执行赋值,value1、value2 都是 0,然后再执行构造函数的++,就都变成 1 了。
例 2:
1) “我是 main 函数所在的类”肯定要先初始化,没啥可说的。
2) MSG 这个静态变量是在父类中,所以子类不会初始化,也就不会打印出“子类 init”。
3) MSG 是 final 类型的静态变量,且是确定值的常量,所以 ParentClass 也不会初始化,
不会打印出“父类 init”。
4) 将 MSG 改为
public final static String MSG = UUID.randomUUID().toString().toUpperCase();
这个变量是不确定的变量,则 ParentClass 会被初始化,则“父类 init”会被打印出来。
例 3:
子类增加一个静态变量,引用的时候就需要初始化子类(注意,这里的静态变量不
是 final),按照初始化子类要先初始化父类的原则,先执行父类的初始化,打印出
“父类 init”,再初始化子类,打印出“子类 init”,最后打印出子类的静态变量。
如果子类的静态变量改成 final 常量,
public final static String SonMSG="Son Hello";
则子类、父类都不会初始化。
如果子类的静态变量变成 final 变量,
剩余28页未读,继续阅读
白羊的羊
- 粉丝: 35
- 资源: 281
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Picasso_v3.1 2.ipa
- chromedriver-mac-arm64.zip
- 蓝zapro.apk
- chromedriver-linux64.zip
- UCAS研一深度学习实验-MNIST手写数字识别python源码+详细注释(高分项目)
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- 基于SVM多特征融合的微表情识别python源码+项目说明+详细注释(高分课程设计)
- html动态爱心代码一(附源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0