闭关修炼100天 JavaEE乱杀 闭关第一天

闭关修炼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值
*/
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值