闭关修炼100天 JavaEE乱杀
第一个代码及详解
//公共的类Test01
public class Test01{
//公共的静态的无返还值的主函数(字符串类型数组args)
public static void main(String[] args){
System.out.println("Hello word...1");//系统输出打印换行Hello word...1
System.out.println("Hello word...2");
System.out.println("Hello word...3");
}
}
/**
1.我很疑惑这些关键字的含义
2.也很疑惑为什么类名和文件名得一样
3.我很疑惑这个String[] args
4.我很疑惑为什么不直接写System.println或者println
5.为什么要javac Test01.java
6.为什么要java Test01(为什么不是Test01.class)
*/
第三个疑惑解答
我很疑惑这个String[] args
第三个疑惑解答我在网上收了一下,大概弄懂了咋回事。let me show you
public class Test01{
public static void main(String[] args){
System.out.println("args[0]");
System.out.println("args[1]");
System.out.println("args[2]");
}
}
/**
然后我们在cmd(也就是命令行)中输入
javac Test01.java
java Test01 7 77 777
你猜输出结果是什么?
我告诉你是
args[0]
args[1]
args[2]
原因就是System.out.println("args[0]")这个args[0]被当作字符串处理了
改一下把""去掉输出结果为
args[0]
args[1]
args[2]
原因:未重现编译 重新编译一下,结果为
7
77
777
*/
看完上面哥们的究极报错,你也应该明白了String[] args的意思,接受命令行输入的字符串
第一个疑惑
这个疑惑会在接下来的天数内解决,一个一个的了解
第二个疑惑
为什么类名和文件名得一样
我尝试类名与文件名不一致,答案给我说必须一致,我很疑惑,我现在暂且相信是因为直接运行的类
第四个疑惑
我很疑惑为什么不直接写System.println或者println
终于在网上找到了,因为println这个输出方法是在System这个类中的静态成员out中的,在Test01这个类中去调用就要通过这种方式,我突然有点感觉像c了,结构体就是这样.出来的
第五个疑惑
为什么要javac Test01.java
JDK:java运行工具(写代码时用到的工具)
JRE:java运行环境(class运行的环境)
JVM: java虚拟机(JRE的一部分)
我们要知道一个事情,代码是不能直接运行到计算机上的,语言分为编译性语言和解释性语言。
c和c++是编译性语言
javascript是解释性语言
java也被划分到解释性语言,但java是运行在虚拟机上的,也就是JVM,java编写的代码,先被转换成class文件(字节码文件),在被运行在匹配系统的JVM虚拟机上,这个时候就大概知道javac Test01.java的作用了,把Java文件编译成class文件。
第六个疑惑
为什么要java Test01(为什么不是Test01.class)
解决完第五个疑惑之后,我大致就明白了为什么要java Test01是运行class文件,但为什么不加class呢,别急,让我上网搜一搜,ok,懂了一个大概,深入的话以后去看底层原码应该能知道,大致就是java虚拟机运行的不是.class文件而是这个类,你懂了吗,就是是Test01这个类,这也是为什么类名和文件名要一致的原因。
第二个代码及详解
public class Test01{
public static void main(String[] args){
//定义一个整数变量age,并把18赋值给它
int age = 18;
System.out.println(age);//输出age
}
}
/**
答案很简单,18,但我在思考age的底层逻辑是否与c一样,让我来看看,我只定义age,但不给它初始化,也就是int age;然后输出,发现为初始化变量在Java里并不能使用,为啥啊,不应该输出垃圾值吗?这是因为java为了安全性,规定了变量必须初始化
*/
第三个代码及其详解
public class Test01{
public static void main(String[] args){
float f = 222.222f;//定义float类型f,把222.222赋值给它
System.out.println(f);//输出f
}
}
float类型值数据后为什么要加f
f = 222.222f这是为了消除歧义,确保编译器正确解析和处理浮点数
第三个代码及其详解
public class Test01{
public static void main(String[] args){
double a = 18.8f;
System.out.println(a);
}
}
/**
这里输出a是18.799999237060547
不加f输出就是18.8
*/
我纠结于为什么,应该与补码有关或者与浮点数底层存储逻辑有关,等我学到再说,先往后学
第四个代码及其详解
public class Test01{
public static void main(String[] args){
long a = 12345678901;
System.out.println(a);
}
{
/**
这里报错,过大的整数:12345678901
12345678901按道理来说向上转型为long不应该报错啊,long的取值范围是比12345678901大的啊
这是因为其实报错跟long a = 根本没有任何关系
12345678901的数据字面量应该是int,但是12345678901超出了int的数字字面量,所以直接报错
我们这里用强转试试
long a = (long)12345678901这里还是直接报错,问题其实是一样的,向上转型本来就不需要强转
12345678901这个数因为超过了int的字面量直接就报错了
解决方法
long a = 12345678901L,解决方法就是把数字字面量声明为long类型
*/
第五个代码及其详解
public class Test01{
public static void main(String[] args){
float a = 1.0;
System.out.println(a);
}
}
/**
这里直接报错,从double转换到float类型可能会有损失
其实第三个代码里我已经说了,小数点的数字字面量是double
这里有两个解决方法
1.解决方法一 强转
float a = (float)1.0
//这里会导致消耗空间,因为1.0是double类型数据字面量分配64位空间又强制转换为32位空间
2.解决方法二 声明
float a = 1.0f
//声明1.0是float类型数据字面量,直接分配30位空间
*/
第六个代码及其详解
public class Test01{
public static void main(String[] args){
boolean a = true;
int b = a;
System.out.println(b);
}
}
/**
直接报错,不兼容类型,boolean无法转换位int
即使boolean底层就是int,但java就是规定了我们无法去获取它的int值
*/