java小心机(2)| 重载和构造器的小细节
每天进步一点点,距离大腿又近一步! 阅读本文大概需要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)| 重载和构造器的小细节的更多相关文章
- java小心机(3)| 浅析finalize()
每天进步一丢丢,连接梦与想 如果你停止就是谷底,如果你还在努力就是上坡 系列文章 java"小心机"(1)[资源彩蛋!] java小心机(2)| 重载和构造器的小细节 预备知识 J ...
- java"小心机"(1)【资源彩蛋!】
每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...
- java小心机(5)| 浅谈类成员初始化顺序
类成员什么时候会被初始化呢?一般来说:"类的代码在初次使用时才被加载",加载过程包括了初始化. 比如说new A()调用构造函数时,类中全部成员都会被初始化. 但对于static域 ...
- 8、java高级面向对象-重载、构造器重载、初始化块、this、super、对象构造和初始化分析、覆盖、toString
1.方法的重载(overload) 同一个类中同时存在一个以上的同名函数,参数个数或类型不同或顺序不同,称为方法的重载. 和返回值无关! 构造器重载:非默认构造器和默认构造器其实就是方法的重载. 2. ...
- Java在处理大数据的时候一些小技巧
Java在处理大数据的时候一些小技巧 发布时间:2013-05-09 00:00:00 来源:中国IT实验室 作者:佚名 关键字:Java 众所周知,java在处理数据量比较大的时候,加载到内存必 ...
- Java中的方法重载
一.什么是方法重载? 方法重载就是两个或多个方法的方法名相同,但是方法的形参类型,数量,顺序不同. 上面提到的三点也就是一个方法的特征标,只要有一点不相同,则该方法就不相同,就可以实现重载. 在这里的 ...
- 在Python中该如何实现Java的重写与重载
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...
- Java中方法的重载
Java 中方法的重载 问: 什么是方法的重载呢? 答: 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方 ...
- Java 读书笔记 (十七) Java 重写(Override)与重载(Overload)
重写(Override) 重写是子类对父类的允许访问的方法的实现过程重新编写,返回值和形参都不能改变,即外壳不变,核心重写. // 如果重写不是相当于重新定义了一个方法?那为什么不直接写,还要exte ...
随机推荐
- <Standard Template Library>标准模板库专项复习总结(二)
4.队列 先进先出(FIFO)表 头文件:#include<queue> 变量的定义:queue<TYPE>queueName 成员函数: bool empty() 空队列返回 ...
- docker安装,和虚拟机区别
docker安装 1 在 CentOS 6.4 上安装 docker docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172). docker官方 ...
- CountDownLatch 部分加载和同时并发业务。
按顺序部分加载: import java.util.concurrent.CountDownLatch; /** * @Title: ThreadCountDownTest.java * @Descr ...
- Xgboost参数调节
转自:https://segmentfault.com/a/1190000014040317 整体: # 1.调试n_estimators cv_params = {'n_estimators': [ ...
- Visual Studio Team Services使用教程【2】:添加团队成员
2017.4.23之后建议朋友看下面的帖子 TFS2017 & VSTS 实战(繁体中文视频) Visual Studio Team Services(VSTS)与敏捷开发ALM实战关键报告( ...
- 什么是激励函数 (Activation Function)
relu sigmoid tanh 激励函数. 可以创立自己的激励函数解决自己的问题,只要保证这些激励函数是可以微分的. 只有两三层的神经网络,随便使用哪个激励函数都可以. 多层的不能随便选择,涉及梯 ...
- Mysql(超级详细)
Mysql(超级详细) (黑小子-余) 一.Mysql介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理 ...
- ELK学习实验007:Nginx的日志分析系统之Metribeat配置
一 Metricbeat 简介 1.1 系统级监控,更简洁将 Metricbeat 部署到您的所有 Linux.Windows 和 Mac 主机,并将它连接到 Elasticsearch 就大功告成了 ...
- Qt listWidget和QListWidgetItem的简单使用
简单的来实习了下 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QListWid ...
- 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)
[题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...