每天进步一点点,距离大腿又近一步! 阅读本文大概需要10分钟

java小心机,为你诉说java鲜为人知的一面

涉及基本数据类型的重载

基本类型能从一个”较小”的类型自动提升到”较大”的类型(扩展转换),此过程一旦牵涉到重载,可能就会造成一些混淆

看下以下例子,你是否清楚地知道答案?

import static java.lang.System.*;

public class PrimitiveOverLoading {
public static void f1(char x){System.out.print("f1(char) ");};
public static void f1(byte x){System.out.print("f1(byte) ");};
public static void f1(short x){System.out.print("f1(short) ");};
public static void f1(int x){System.out.print("f1(int) ");};
public static void f1(long x){System.out.print("f1(long) ");};
public static void f1(float x){System.out.print("f1(float) ");};
public static void f1(double x){System.out.print("f1(double) ");}; public static void f2(byte x){System.out.print("f2(byte) ");};
public static void f2(short x){System.out.print("f2(short) ");};
public static void f2(int x){System.out.print("f2(int) ");};
public static void f2(long x){System.out.print("f2(long) ");};
public static void f2(float x){System.out.print("f2(float) ");};
public static void f2(double x){System.out.print("f2(double) ");}; public static void f3(short x){System.out.print("f3(short) ");};
public static void f3(int x){System.out.print("f3(int) ");};
public static void f3(long x){System.out.print("f3(long) ");};
public static void f3(float x){System.out.print("f3(float) ");};
public static void f3(double x){System.out.print("f3(double) ");}; public static void f4(int x){System.out.print("f4(int) ");};
public static void f4(long x){System.out.print("f4(long) ");};
public static void f4(float x){System.out.print("f4(float) ");};
public static void f4(double x){System.out.print("f4(double) ");}; public static void f5(long x){System.out.print("f5(long) ");};
public static void f5(float x){System.out.print("f5(float) ");};
public static void f5(double x){System.out.print("f5(double) ");}; public static void f6(float x){System.out.print("f6(float) ");};
public static void f6(double x){System.out.print("f6(double) ");}; public static void f7(double x){System.out.print("f7(double) ");}; void testConstVal(){
out.print("5: ");
f1(5);f2(5);f3(5);f4(5);f5(5);f6(5);f7(5);out.println();
} void testDecimalVal(){
out.print("5.2: ");
f1(5.2);f2(5.2);f3(5.2);f4(5.2);f5(5.2);f6(5.2);f7(5.2);out.println();
} void testChar(){
char x = 'x';
out.print("char: ");
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);out.println();
} void testByte(){
byte x = 0;
out.print("byte: ");
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);out.println();
} void testShort(){
short x = 0;
out.print("short: ");
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);out.println();
}
void testInt(){
int x = 0;
out.print("int: ");
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);out.println();
} void testLong(){
long x = 0;
out.print("long: ");
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);out.println();
} void testFloat(){
float x = 0;
out.print("float: ");
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);out.println();
}
void testDouble(){
double x = 0;
out.print("double: ");
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);out.println();
} public static void main(String[] args){
PrimitiveOverLoading p = new PrimitiveOverLoading();
p.testConstVal();
p.testDecimalVal();
p.testChar();
p.testByte();
p.testShort();
p.testInt();
p.testLong();
p.testFloat();
p.testDouble();
}
}

输出如下:

5: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)
5.2: f1(double) f2(double) f3(double) f4(double) f5(double) f6(double )f7(double)
char: f1(char) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)
byte: f1(byte) f2(byte) f3(short) f4(int) f5(long) f6(float) f7(double)
short: f1(short) f2(short) f3(short) f4(int) f5(long) f6(float) f7(double)
int: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)
long: f1(long) f2(long) f3(long) f4(long) f5(long) f6(float) f7(double)
float: f1(float) f2(float) f3(float) f4(float) f5(float) f6(float) f7(double)
double: f1(double) f2(double) f3(double) f4(double) f5(double) f6(double) f7(do

可得出以下结论:

1.常数值5会被当做int值处理,常数值5.2会被当做double值处理

2.当传入的数据类型小于方法中声明的形参类型,实际数据就会被提升至最近的数据类型。

3.特例:对于char,如果无法恰好找到char参数的方法,且int参数方法存在时,char直接提升至int型

思考题:反过来,当传入的数据类型大于方法中声明的参数类型呢?(自行实践,相关阅读:java”小心机”(1)【资源彩蛋!】第4点类型转换

构造器中调用构造器

一个类中可能写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。构造器中调用构造器时,有几点细节需要注意,看下面例子:

注://! 为编译会报错的代码

public class Constructor {
private String str;
private int i;
private float f; Constructor(String str){
this.str = str;
} Constructor(int i){
this.i = i;
} Constructor(String str,int i){
//1.无法直接调用,需要使用this添加参数列表调用
//! Constructor(str);
this(str);
//2.只能调用一次构造器
//! this(i);
this.i = i;
} Constructor(String str,int i,float f){
this.str = str;
this.i = i;
//3.只能在第一行调用构造器,否则编译不通过
//! this(str);
} //普通方法
void normalMethod(){
//4.除构造器外,编译器禁止其他任何方法调用构造器
//! this(str);
}
}

总结:

1.无法直接调用构造器,需要使用this添加参数列表调用

2.只能调用一次构造器

3.只能在构造器中第一行调用构造器,否则编译不通过

4.除构造器外,编译器禁止其他任何方法调用构造器

热门阅读:

**【推荐两款神器】不限速下载、追剧神器

java”小心机”(1)【资源彩蛋!】

**实用代码|javaMail发送邮件(文末重磅资源!)

java面试系列文章:

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

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

java面试| 精选基础题(3)**

end~thanks!

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

期待你的到来!

java小心机(2)| 重载和构造器的小细节的更多相关文章

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

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

  2. java"小心机"(1)【资源彩蛋!】

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...

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

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

  4. 8、java高级面向对象-重载、构造器重载、初始化块、this、super、对象构造和初始化分析、覆盖、toString

    1.方法的重载(overload) 同一个类中同时存在一个以上的同名函数,参数个数或类型不同或顺序不同,称为方法的重载. 和返回值无关! 构造器重载:非默认构造器和默认构造器其实就是方法的重载. 2. ...

  5. Java在处理大数据的时候一些小技巧

    Java在处理大数据的时候一些小技巧 发布时间:2013-05-09 00:00:00 来源:中国IT实验室 作者:佚名   关键字:Java 众所周知,java在处理数据量比较大的时候,加载到内存必 ...

  6. Java中的方法重载

    一.什么是方法重载? 方法重载就是两个或多个方法的方法名相同,但是方法的形参类型,数量,顺序不同. 上面提到的三点也就是一个方法的特征标,只要有一点不相同,则该方法就不相同,就可以实现重载. 在这里的 ...

  7. 在Python中该如何实现Java的重写与重载

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...

  8. Java中方法的重载

    Java 中方法的重载 问: 什么是方法的重载呢? 答: 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方 ...

  9. Java 读书笔记 (十七) Java 重写(Override)与重载(Overload)

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程重新编写,返回值和形参都不能改变,即外壳不变,核心重写. // 如果重写不是相当于重新定义了一个方法?那为什么不直接写,还要exte ...

随机推荐

  1. ZR993

    ZR993 首先,这种和平方有关的,首先应当考虑根号做法 这道题目,我们可以直接暴力\(\log_{10}w + 10\)判断一个数是否能够由原数变化的到 直接\(O(\sqrt{n})\)枚举所有的 ...

  2. 循环语句作业与循环补充(continue与break)

    作业: 1.使用while循环输入1 2 3 4 5 6 8 9 10(没有7) n = 1 while n < 11: if n == 7: pass else: print(n) n = n ...

  3. python 处理xml文件

    需求 在实际应用中,需要对xml配置文件进行实时修改, 1.增加.删除 某些节点 2.增加,删除,修改某个节点下的某些属性 3.增加,删除,修改某些节点的文本 <annotation> & ...

  4. 查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)

    前言 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都 ...

  5. 百度DMA+小度App的蓝牙语音解决方案技术难点解析

    前记   你平时在商场看到的语音助手,看起来非常的简单,其实,这个小小语音助手的背后,是一个非常的复杂的技术支撑.从前端到后端的技术依次是:前端语音降噪技术,高效的音频编解码技术,蓝牙双模技术,DMA ...

  6. 【小技巧】object上显示div

    这个现在不大常用了,就是object在页面中显示的优先级最高,其他层想覆盖在其上面,设置的z-index再高都不管用,解决办法是在层中加一个iframe.不多说了,直接记录下代码吧,估计以后用到的机率 ...

  7. 洛谷$P3749$ [六省联考2017] 寿司餐厅 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 这道题好烦昂,,,就给了好多变量,,,但仔细读一遍题还是能$get$的所以我就不再提取一遍题目大意辣$QwQ$? 显然考虑建两排点,一排收益一排支出然后最小 ...

  8. 洛谷P1462 通往奥格瑞玛的道路 题解 最短路+二分答案

    题目链接:https://www.luogu.com.cn/problem/P1462 题目大意: 有 \(n\) 个点 \(m\) 条边,每个点有一个点权,每个边有一个边权.求所有长度不超过 \(b ...

  9. 性能数据的准备-Jmeter

    性能测试的一般流程: 收集性能需求——>编写性能脚本——>执行性能测试——>分析测试报告——>系统性能调优 在收集性能需求后,我们会思考: 负载测试时并发时需要多少数据?例:登 ...

  10. bootstrap:导航下拉菜单

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