每天进步一点点,距离大腿又近一步! 阅读本文大概需要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. linux 操作 I/O 端口

      在驱动硬件请求了在它的活动中需要使用的 I/O 端口范围之后, 它必须读且/或写到这些 端口. 为此, 大部分硬件区别 8-位, 16-位, 和 32-位端口. 常常你无法混合它们, 象你 正常使 ...

  2. dotnet core 用值初始化整个数组

    如果想要创建一个数组,在这个数组初始化一个值,有多少不同的方法? 本文告诉大家三个不同的方法初始化 在开发中,会不会用很多的时间在写下面的代码 var prime = new bool[1000]; ...

  3. Weblogic/WAS之Full GC监控与计算

    在网上看到关于内存回收机制,同大家一起分析探讨.堆内存划分为Eden.Survivor 和 Tenured/Old 空间,如下图所示: Minor GC 会清理年轻代的内存,Major GC 是清理老 ...

  4. webpack 命令

    --content-base <file/directory/url/port>:内容的路径. --quiet: 在控制台不输出任何内容 --no-info: 抑制无聊的信息 --colo ...

  5. (推荐)linux用一键安装包

    linux一键安装包内置了XXD.apache, php, mysql这些应用程序,不需要再单独安装部署. 从7.3版本开始,linux一键安装包分为32位和64位两个包,请大家根据操作系统的情况下载 ...

  6. C Primer Plus(二)

    重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 分支和跳转 1.ctype.h头文件里包含了一些列用于字符判断的函数,包括判断数字.大 ...

  7. 14.python案例:爬取电影天堂中所有电视剧信息

    1.python案例:爬取电影天堂中所有电视剧信息 #!/usr/bin/env python3 # -*- coding: UTF-8 -*- '''======================== ...

  8. Java小项目之:五子棋,你下棋下得过电脑吗?

    Java小项目之:五子棋,你下棋下得过电脑吗? Java五子棋功能要求: 1.创建窗口和设计一个棋盘界面 2.实现鼠标点击,棋子出现,黑白棋轮流下 3.能够判断五子相连输赢 4.添加重新开始,悔棋,退 ...

  9. 利用SSH桥接访问服务器的Docker运行的MySql服务

    前情提要 docker的运用越来广泛,许多IT公司都已经将自己的服务跑在Docker上面.在安全性方面又做了一层防护.比如:跑在Docker上的Mysql不做外网端口映射,只能在linux服务器上或进 ...

  10. try catch 自定义捕获异常

    当我们完成一个程序时,如果没有异常捕获的话,用户使用时会出现许多bug.而加入异常捕获之后便会提醒用户使用时避免产生不必要的错误.具体操作实现如下: 首先创造一个MyException类,继承自Exc ...