每天进步一点点,距离大腿又近一步! 阅读本文大概需要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. jQuery 工具类函数-字符串操作函数

    调用名为$.trim的工具函数,能删除字符串中左右两边的空格符,但该函数不能删除字符串中间的空格,调用格式为: $.trim (str); 参数str表示需要删除左右两边空格符的字符串. <bo ...

  2. Linux 内核pci添加一个驱动

    一个 PCI 驱动被添加到 PCI 核心, 当它调用 pci_register_driver 函数时. 这个函数 只初始化 struct device_driver 结构, 这个结构包含在 struc ...

  3. es6笔记 day3---Promise

    作用:解决异步回调问题 先知道它的大概语法就好了,这个东西需要平时用到才知道它的用处 语法: let promise= new Promise(function(resolve,reject){ // ...

  4. LuoguP3045牛券Cow Coupons

    LuoguP3045 [USACO12FEB]牛券Cow Coupons 果然我贪心能力还是太差了 ZR讲过的原题我回来对做法没有一丁点印象 有时候有这样一种题目 每个数有两种不同的价值 你可以选择价 ...

  5. linux之旅首页

    为什么有此系列文章 目录 为什么有此系列文章 一直使用windows,决定使用linux作为操作系统. 使用此系列文章来记录我使用linux过程中遇到的问题,和应对方式 目录 安装linux

  6. 【49.23%】【hdu 1828】Picture

    Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  7. ELK系统分析nginx日志

    一.nginx nginx 服务器日志的log_format格式: log_format main '$remote_addr - $remote_user [$time_local] "$ ...

  8. 【一起学源码-微服务】Nexflix Eureka 源码八:EurekaClient注册表抓取 精妙设计分析!

    前言 前情回顾 上一讲 我们通过单元测试 来梳理了EurekaClient是如何注册到server端,以及server端接收到请求是如何处理的,这里最重要的关注点是注册表的一个数据结构:Concurr ...

  9. cocos2dx Vec2

    //SE是坐标重叠部分 // returns true if segment A-B intersects with segment C-D. S->E is the overlap part ...

  10. SimpleFactoryPattern(简单工厂模式)-----Java/.Net

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...