每天进步一点点,距离大腿又近一步!

阅读本文大概需要9分钟

java”小心机”系列文章在此开篇。在这,将会给你带来曾经错过、忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复知识漏洞,夯实地基,建立更全面的知识体系。

1.一个类中,以什么标识某个方法

方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法。(引用自[Thinking in java])

关联知识点:返回值是否能区分重载方法?

我们来看下以下例子中两个方法

void f() {};int f() { return 1; };

调用方法注重返回值时,比如在int i = f()中,确实可以区分重载方法。但有时,你并不关心返回值,只想要方法调用的其他效果,这时你可能会调用方法而忽略返回值。就像这样:f();

此时,我们是无法理解这种代码的?更何况是机器?

因此,根据返回值区分重载方法时行不通的。(java中也禁止例子中的代码,编译是不通过的)

2.java包的静态导入

使用import static可导入某个包中的static成员,后缀*导入全部static成员

import static java.lang.System.out;
import static java.lang.Integer.*; public class Test{
public static void main(String[] args){
out.println("hello java");
out.println(MAX_VALUE);
out.println(MIN_VALUE);
}
}

结果:

hello java2147483647-2147483648

从以上代码可以看到,静态导入System.out,直接使用

out.println()``==``System``.out.println(),

Integer类也是如此,

MAX_VALUE``==``Integer.MAX_VALUE,

MIN_VALUE``==``Integer.MIN_VALUE

优点:简化代码

缺点:降低了代码可读性

建议:大量使用了某个类的静态成员时可考虑使用(代码简洁与可读性的取舍,结合实际情况吧)

3.自增自减的前后缀式(初学者较难理解的点)

前缀式:先执行运算,再生成结果

后缀式:先生成结果,再执行运算

import static java.lang.System.*;

public class AutoInc {
public static void main(String [] args){
int i = 1;
out.println("i " + i);
out.println("++i : " + ++i);
out.println("i++ : " + i++);
out.println("i : " + i);
out.println("--i : " + --i);
out.println("i-- : " + i--);
out.println("i : " + i);
}
}

结果:

i : 1
++i : 2
i++ : 2
i : 3
--i : 2
i-- : 2
i : 1

分析:

++i先运算i+1再生成结果i=2

i++先生成结果i(略掉自增符号即为结果),再运算i-1

我们再看下一题(别看结果,试着做一下):

z=3、x=1、y=2
问z -= --y - x--
此时z =?, y=?,x=?

结果为:

z=3
y=1
x=0

运算步骤:

1.--y -> y = y -1 = 1

2.x--此处为后缀式,先生成结果z- = y-x(忽略自减符号即为结果),则z = z - (y - x) = 3,再运算x-- ->x = x-1= 0

4.类型转换(扩展转换和窄化转换)

扩展转换:即较类型赋值给较类型时进行的类型转换。较大类型肯定可以容纳较小类型的信息,不会造成信息丢失,无需进行显示转换,编译器会自动将进行转换(隐式转换)

窄化转换:即较类型赋值给较类型时进行的类型转换。较小类型可能无法容纳较大类型的信息,可能会造成信息丢失,需要进行显示转换

public class Casting {
public static void main(String[] args){
int i = 100;
long lng1 = i;//扩展转换,无需显示转换
lng1 =(long) i;//"多余的"显示转换,可提醒自己需要留意
long lng2 = 200;
i = (int) lng2;//窄化转换,必须显示转换,否则报错
}
}

5.类型提升

对基本数据类型执行算术运算或按位运算时,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型,较小的数据类型会在运算时自动转换成该结果类型

例子:

int i = 1;
long lng = 2;
long result = i + lng;//运算前,`int i`自动转换为long类型

6.基本类型包装类的常量池

java面试|精选基础题(2)一文中就有提到Integer的常量池,其实java中基本类型的包装类的大部分都实现了常量池技术。

对包装类进行赋值时,字面量值在[-128,127]间时,将使用常量池中对象,反之则创建新的对象。

  • 已实现常量池的类:

    Byte,Short,Integer,Long, Character,Boolean

  • 未实现:Float,Double

看一下以下代码:

public class Cache {
public static void main(String[] args){
//实现常量池的包装类以Long为例
//在值小于127,可以使用常量池
Long i1 = 127L;
Long i2 = 127L;
System.out.println(i1 == i2);//输出true //值大于127,不会从常量池中取对象
Long i3 = 128L;
Long i4 = 128L;
System.out.println(i3 == i4);//输出false //Boolean类也实现了常量池技术
Boolean bool1 = true;
Boolean bool2 = true;
System.out.println(bool1 == bool2);//输出true //浮点类型的包装类没有实现常量池技术
Float f1 = 3.0f;
Float f2 = 3.0f;
System.out.println(f1 ==f 2);//输出false Double d1 = 1.0;
Double d2 = 1.0;
System.out.println(d1 == d2);//输出false
}
}

若想深究其原理,首先需要了解其中装箱的本质是什么?(可看java面试|精选基础题(2)文中第一题)将基本类型赋值给包装类时,实际上执行了包装类的valueOf方法。 以Long为例,看一下相关源码(其他包装类常量池实现方法类似) valueOf方法源码:

 public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}

可以看出,当字面量值在[-128,127]间,返回LongCache中的值

再来看LongCache(Long常量池)源码:

 private static class LongCache {
private LongCache(){} static final Long cache[] = new Long[-(-128) + 127 + 1]; static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}

LongCache是Long的静态内部类,虚拟机加载Long类就会将[-128,127]的值存储在Long cache[]中。


重磅好消息:小编考虑到同学们对学习资源的迫切需求,近期将整理出学习视频库和电子书库,你想要的资源全在这里,该资源永久有效,不断更新,敬请期待!

你若对某方向的资源迫切需要,请点击【阅读原文】添加小编微信,备注【资源:XXX】,小编将重点整理!

热门阅读:

java面试| 精选基础题(1)

java面试|精选基础题(2)

限时领取| 热门编程语言学习资源,不收藏吗?(文末送书)

end~thanks!

一个立志成大腿而每天努力奋斗的年轻人

期待你的到来!

java"小心机"(1)【资源彩蛋!】的更多相关文章

  1. java小心机(3)| 浅析finalize()

    每天进步一丢丢,连接梦与想 如果你停止就是谷底,如果你还在努力就是上坡 系列文章 java"小心机"(1)[资源彩蛋!] java小心机(2)| 重载和构造器的小细节 预备知识 J ...

  2. java小心机(2)| 重载和构造器的小细节

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要10分钟 java小心机,为你诉说java鲜为人知的一面 涉及基本数据类型的重载 基本类型能从一个"较小"的类型自动提升到&qu ...

  3. java小心机(5)| 浅谈类成员初始化顺序

    类成员什么时候会被初始化呢?一般来说:"类的代码在初次使用时才被加载",加载过程包括了初始化. 比如说new A()调用构造函数时,类中全部成员都会被初始化. 但对于static域 ...

  4. java小心机(4)| 继承与组合的爱恨情仇

    在java中,有两种主要复用代码的方法:继承和组合. 继承,是OOP的一大特性,想必大家都非常熟悉了;组合,其实也很常见,只是不知道它的名字罢了. 继承 子类拥有父类的基本特性,需使用extend关键 ...

  5. java小心机(6)| 多态的一些坑

    对于"多态"的概念,想必大家都很熟悉了,但我们还是来回顾一下吧 class Actor { public void act(){ System.out.println(" ...

  6. Chrome 中的彩蛋,一款小游戏,你知道吗?

    今天看到一篇文章,介绍chrome中的彩蛋,带着好奇心进去看了一眼,没想到发现了一款小游戏,个人觉得还不错,偶尔可以玩一下,放松放松心情!^_^ 当 Chrome 无法连接到互联网时, 或者上着网突然 ...

  7. 死磕 java集合之TreeMap源码分析(四)-内含彩蛋

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 二叉树的遍历 我们知道二叉查找树的遍历有前序遍历.中序遍历.后序遍历. (1)前序遍历,先遍历 ...

  8. SpringBoot的一个小彩蛋

    彩蛋这种东西还算比较常见,在电影或者游戏里面我们也遇见过不少.今天就简单介绍一下SpringBoot里面的一个小彩蛋. 玩过SpringBoot的同志都知道,SpringBoot的启动界面是这酱紫的: ...

  9. 【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)

    目录 视频讲解: 一.数组的概述 二.一维数组的使用 三.Arrays工具类中的sort方法(sort方法用的多,我们具体讲一下) 四.数组中的常见异常 五.一维数组练习题 六.彩蛋(本期视频使用的P ...

随机推荐

  1. 使用git命令修改commit提交信息

    很多时候我们在提交代码时可能会把commit提交信息写错了,这个时候我们就可以用到下面的git命令来修改commit提交信息 git commit --amend 输入"i"之后进 ...

  2. CodeForces 1213F (强联通分量分解+拓扑排序)

    传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...

  3. umask 设置

    背景: 有时候需要在linux上从其他人的目录里copy文件过来. 最近遇上的事情很麻烦,就是copy的时候发现很多文件copy不过来,copy一个文件夹时,当前文件把权限修改了,结果子目录的中的还没 ...

  4. Centos 7.5安装 Mysql5.7.24

    1. 下载 MySQL 本文采用的Linux为是腾讯云 标准型S2 (1 核 1 GB) Centos 7.5 64位  1.1 官网下载地址: https://dev.mysql.com/downl ...

  5. jenkins邮件通知html魔板

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Python 类的常用内置方法

    类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,类的内置方法,会在满足某种条件下自动触发. 1.1__new__ __new__:在___init__触发前, ...

  7. leetcode.769旋转字符串

    给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...

  8. $Noip2014/Luogu1351$ 联合权值 树形

    $Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所 ...

  9. JS进阶——this绑定了谁?

    一.this的意义 二.寻找this绑定对象 经常听到这么一句话,找this只需要看谁是调用方.当函数被调用时会记录函数调用调用方式.传参包括this等各种属性.有时候this绑定对象情况太抽象,找到 ...

  10. .gitignore使用

    一.简绍 我们做的每个Git项目中都需要一个".gitignore"文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中.比如我们项目中的npm包(node_modul ...