java在我看来是一门很好的语言,虽然没有python语言那样对初学者那么友好,但对于我们来说学一个门槛高点的语言是必要的,博主也推荐大家先学c语言,博主是在c学过语言基础上讲解的,传语言也很锻炼自己的思想。
下面我们就开始java的学习吧
1,初始java语言
在java当中有一句话,“一次编译到处运行”,这是什么意思呢,在C语言中我们会分64位机器和32位机器,这样的话代码的可移植性会很低,而java中,我们通过java.c编译java源代码,java.c生成二进制的.class字节码文件,字节码文件会加载到虚拟机jvm上,在jvm上运行我们的代码,开发者只需要编写一次代码,就可以在任何支持JVM的设备上运行,无论是Windows、Linux、Mac OS还是移动设备。这极大地简化了软件开发和部署的过程,减少了维护成本,提高了代码的复用性。
那么我们说的这个java.c呀啥的很复杂吧,我们现在要自己去操作下,来体验这个过程,我们首先要安装jdk,这里推荐去b站搜比特大博哥,他把java学习需要的大部分软件都提供了,还有idea直接提交gitee的原理和方法。
在安装好jdk时我们可以通过记事本来编写运行java代码,是不是感觉很酷,可以装一下,我们首先打开记事本,随便写一行java代码
我们一定要把这个文件扩展名打开,要不他会把.java文件设置为记事本文件。
我们按下win+r打开命令提示符输入cmd
就会出现这样的窗口
我们找到我们编写记事本的那个路径,在窗口中输入cd 再输入路径
这样就成功了
用javac转化,就会出现一个.class字节码文件
接下来我们就能实现代码编译了,我们刚才在记事本上想要打印HelloWorld我们输入java Test找到那个类,可能现在理解不了,我们的目的数小装一下,哈哈。
我们就实现了,我们还可以通过cmd打开qq呀之类的我们首先要找到qq的exe路径,
选择这个路径,输入qq.exe
打开了神奇吧,哈哈现在我们来正式开始java的学习嗷,
2,数据类型
在java中有8种基本数据类型,4种引用类型
基本数据类型有:整 byte int long short
浮点 Double float
字符 char
布尔 boolean
引用类型有:数组 类 接口..... String
引用类型我们在后面会介绍,这里和c语言差不多,byte占1个字节,int占4个字节,long占8个字节,short占2个字节,Double占8个字节,float占4个字节,char不一样,他占2个字节而c语言只占一个,所以java中的字节是可以存放汉字和特殊字符的,boolean我们不做研究,因为boolean的大小是根据jvm模型等其他情况决定的,不同情况大小不同。
我们接下来用代码看看这些基本类型的大小,
public class Test {
public static void main(String[] args) {
System.out.println(Byte.MAX_VALUE);//byte
System.out.println(Byte.MIN_VALUE);
System.out.println(Long.MAX_VALUE);//long
System.out.println(Long.MIN_VALUE);
System.out.println(Short.MAX_VALUE);//short
System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);//int
System.out.println(Integer.MIN_VALUE);
System.out.println(Double.MAX_VALUE);//double
System.out.println(Double.MIN_VALUE);
System.out.println(Float.MIN_VALUE);//float
System.out.println(Float.MAX_VALUE);
System.out.println(Character.MAX_VALUE);//char
System.out.println(Character.MIN_VALUE);
}
}
127
-128
9223372036854775807
-9223372036854775808
32767
-32768
2147483647
-2147483648
1.7976931348623157E308
4.9E-324
1.4E-45
3.4028235E38
看这个结果就是范围了,哈哈是不是乱七八糟的,我们看我们写的代码,public class test是一个类,里面的public static void main是静态方法。我们就先这么写后面再解释,System.out.println就是输出,我们完全可以看错c语言的int main(){printf("")}这样的语句,大家发现我们并没有输出long,int这些类型而是一些大写的Long,Double,这个是它们的包装类,我们先记下来,除了几个特殊的char为Character,int为Integer其他的都是首字母大写就为它们的包装类,这些都是变量,如果要让他有c语言的conest修饰的变量,让它不可改变呢,java中我们使用final这样变量就无法改变了,还有一个小的易错点啊,就是float类型一定要带f赋值什么意思呢float a = 1.0f一定要加f,要不他就是double类型
强行改变就会报错。
在java中不同类型的运算会发生整型提升,虽然c语言也会有,但是java是很严格的,我们只能把小的类型放到大的类型中
看这个例子,为什么a+b赋值给c会报错呢byte是一个字节相加就会发生整型提升,在运算的时候小于4个字节都会发生整型提升的,所以4个字节的2无法赋值给c
我们可以使用强制类型转换让4个字节的2转化为一个字节的byte,我们不推荐强制类型转换,因为它迟早会出现bug,会导致数据的丢失,我们最好用int来接收,如果是单单一个数赋值给一个变量的话,尽量做到,小类型赋值给大类型。
我们再说一下这个System.out.println这个实质上是拼接很好用的,例如我们定义个字符串,来输出字符串和一堆汉字,String是字符串引用类型,先不提
public class Test {
public static void main(String[] args) {
String str = "java";
System.out.println(str + "真不错");
}
}
是不是很爽,java的这个输出真的很方便的
3,运算符和逻辑控制
运算符这里和c语言是有区别的,c语言中0表示假非零表示真,而java中用boolean类型表示真假,其中false为假,true为真.
&&是逻辑与,就是并且的意思
结果有一个假就为假,两个都为真才为真。
||是逻辑或
只要有一个为真,就是真。
逻辑与存在短路的情况,比如两个表达式,如果第一个表达式错了表达式整个就是错的,他不会去判断第二个表达式了,即使第二个表达式出错也会编译通过
&是按位与
一个字节是32个比特位,这里方便就画了8个
|是按位或
^是按位异或
<<是逻辑左移,有×2的效果
>>是逻辑右移,有除以2的效果
>>>是无符号右移
表达式?表达式:表达式;
都是很基础的,和c差别基本没有,我们就以图片的形式带过了。
在选择语句中
区别也是不大的
if ,else 只有()里的条件不同,这里只能用布尔表达式
switch语句和c语言的区别是()java中不能使用long,double,float,boolean,
for语句,while语句,dowhile语句都是一样的
但是在for()语句中存在一个不一样的,就是for each
public class Test{
public static void main(String[] args){
int[] str = new int[]{1,2,3,4,5,6};
for(int a:str){
System.out.println(a);
}
}
}
str为数组,我们一会儿说,for(第一个为自己初始化的变量,第二个是要遍历的数组)这个for each会遍历数组中的每一个元素
这样循环就说完了,对了,java的输入那么好用,那么我们还可以用c语言的printf吗,当然是可以的,System.out.printf()这样就可以完全使用c语言的语法了,那么输入呢?其实java这门语言不太需要输入,我们以后也用的很少,如果想用的话我们要先导入一个包
import java.util.scanner
Scanner input = new Scanner(System.in);
int n = input.nextInt;
我们创建了对象,这个后面再说吧,先这么记下来。
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while(input.hasNextInt()){
int n = input.nextInt();
}
}
}
我们也可以用hasNextInt()来进行循环输入,用ctrl+d进行停止
4,方法和数组
方法是什么呢,方法就相当于c语言中的函数,用来解决某些问题的工具
这就是方法的构成,跟函数一模一样,其中public和 static是可以替换的先不说,public是公共,可以理解大家都能去访问它,static是静态的意思。
我们用代码来解释下,我们要定义一个方法add,来实现整数的加减乘除
public class Test{
public static int add(int a,int b){
return a+b;
}
public static void main(String[] args) {
int a = 3;
int b = 4;
int c = add(a,b);
}
}
我们在同一个类里创建了两个方法,都是静态的,一个是main方法,相当于c语言的int main()
第二个add方法,我们的形参为a,b,返回值为int,我们传入实参a和b的值调用函数返回a+b的值输出c的值
这就是方法很简单的,形参的改变不会影响实参这里也是适用的,
此外,java中的方法还有新的东西就是方法的重载
方法的重载有三个相关条件1,与原方法的方法名相同 2,与原方法的参数列表不同(包含个数,类型,顺序)3,与原方法的返回值无关
啥意思呢,就比如我们刚才定义的add函数,如果我们想实现3个整数的相加,或者两个浮点数的相加怎么办呢难道还要再重新创建一个add2函数吗,java中给了你方法的重载
public static int add(int a,int b,int c){
return a+b+c;
}
public static double add(double a,double b){
return a+b;
}
我们这样就完成了方法的重载,
public static void main(String[] args) {
int a = 3;
int b = 4;
int c = add(a,b);
double d = add(a,b);
System.out.println(d);
}
int e = add(a,b,c);
这样我们仅通过add函数就能完成多种功能,这就是方法的重载。
接下来我们来讨论数组,
数组的类型是引用,array,也就是int[]很奇怪吧,在c语言中明明是int arr[]这里为啥是这样的,其实,Java的这个类型才是标准的,c语言通常使用指针来代替数组,数组和指针区别并不大,所以实际上c语言数组的数据就是int[] 对,没错,这个就是一个数据类型,那么这个·引用类型到底什么意思呀,
int[] str = new int[]{1,2,3,4,5};
这就是一个很标准的数组的创建,什么意思呢,int[]是类型,声明了str是引用类型,new是创建新对象,我们用引用类型的时候,我们在堆上的引用类型地址指向,在栈上创建的数组,我们画图来说吧
我们在堆上创建的int[]类型的array会在栈上创建一个新的对象,堆上的array会指向栈上创建的对象,这就是引用类型。在java中我们怎么遍历和输出他呢超级简单的我们用代码来说明
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6};
String str = Arrays.toString(arr);
System.out.println(str)
}
}
我们在java中如果不是arr[i]使用的话,System.out.println的话就是打印数组的地址,我们要把数组转化为字符串来使用,java中提供了很多操作数组的函数,大家可以搜java的帮助手册去查看。用for循环和for each来输出我们也来试一下
public class Test {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6};
//String str = Arrays.toString(arr);
//System.out.println(str)
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for (int i:arr){
System.out.println(i);
}
}
}
不用toString遍历数组的方式
这个是是划分内存,刚才讨论的就是堆和java虚拟机栈,而本地方法栈指代底层用c/c++实现的代码。
我们下期讲类和对象,继承,多态。