写在前头
自己之前一直是从事python的,因为部分业务要求需要进行Java的学习,顺道记录一点笔记。
不同在于Java是偏向编译性的语言,python是解释性语言(下面conner只针对java与python的不同点和相同点来对比学习)
学习java之前需要知道jdk,jre这些东西
jdk:java development kit
jre:Java runtime environment
jdk包括了jre
代码规范:
大小写敏感 与python一致;
类名首字母大写采用驼峰式 与python一致;
方法名小写字母开头后面每个词首字母大写 和python不一样python一律小写下划线分开,私有函数前加下划线;
java基本语法:
解析一个常用的java代码如下图(以下主要对比python来比较):
image.png
1.Java是面向对象的语言,一个程序的基本单位就是class,class是关键字,这一点和python一致,该方法里的 class是Hello;
2.public是访问修饰符,表示当前的class是公开的。这一点和python不一样。public除了能修饰class外还能修饰方法。方法就是python里的函数。java中的方法是首字母小写的驼峰式命名方式与python中的下划线命名还是不一样的;
3.在方法的内部Java中每一行语句必须以分号结束,不像python强制以空格来展示区别,看起来可能没有python简洁和整齐;
4.注释也不一样单行时python是# java是//,多行时候python是六个单引号,java是/。。。。。/。
变量和数据类型
变量
概念和用法与python比较像,不多bb,以下主要说区别:
java的变量定义时候必须要定义他的类型,且只需要定义一次就够了。
java中 ========》int x = 1;
python中 ======》x = 1
因为java在定义变量的时候需要强制变量类型,所以下面介绍一下java的基本数据类型:
整数类型:byte,short,int,long
浮点数类型:float,double
字符类型:char
布尔类型:boolean
相比之下python的数据类型就要多很多:有六个标准的数据类型:Number(数字),String(字符串),List(列表),Tuple(元组),Set(集合),Dictionary(字典)
其中number又分为五种数据类型布尔型(bool)、整型(int)、长整型(long)、浮点型(float)和复数(complex)最后一个目前还么有用过。
要了解基本区别需要复习一下计算机内存的基本结构。
计算机内存的最小存储单元是字节,一个字节是一个八位的二进制数,其二进制范围从八个0到八个1,也就是十进制的0~255,一个字节是一个byte,一个byte是八个bits,一个bit是一个二进制数,这个不要记错。
不同类型的大小如下图所示一个方框代表一个byte(该图来自廖雪峰的java教程):
image.png
前四个为整型,第一位带了符号因此能表达的最大值最小值变了,但是范围没有变。
1.测试的时候发现一个很有趣的小点java里设置int类型的时候可以加下划线如下:
int i3 = 2_000_000_000;
相同的写法在python里会是会报错,
2.java的浮点型需要在最后面加上一个f如果不加的话会默认为double类型。相同的还有长整型,长整型在python里也有,不过python里长整型我也没有用过,据说python的整型支持无限位数,那就难怪python能在科学计算上用的这么广泛,而同样情况下使用java你需要考虑溢出的问题。
3.java中在变量前加上final就变成了常量,常量不可以被重复赋值。而python中并没有命名常量,一般约定束成全大写为常量,变量首字母为下划线,但是我好像一直都没有遵从过,以后注意。
4.Java中有一个var关键字,想省略变量类型的是可以用这个关键字,python没有这个东西,所以python在开发中还是很方便的
var sb = new StringBuilder();
变量的作用范围
和python的空格不同,java中作用范围用大括号来区分。
运算
1.四则运算和python基本一致,就是整型计算时有溢出问题要考虑
2.自增,自减和python不一样,python中是i+=1,java里是I++
3.移位运算,java多了两个>>>和<<<表示不带符号的右移运算
4.位运算常常与布尔函数结合使用,因为位运算结果就是0或者1
5.因为java的数字类型有六种,小范围往大范围会自动转换,但是从大范围往小范围转的时候容易出错,相比之下python的number类型就简单很多
6.java中有三元运算: b?X:Y 相比而言python中稍微有些不同:
(python中)X if b else Y,java和python的短路运算是一样的
7.java中的字符和字符串是两个不同的东西,在java中字符是和int,float这种东西一样的东西,比如char c = "中’; 其实他存放的是unicode编码十进制的20013,十六进制的丽,所以在java中char是可以直接和int进行四则计算的。 记住java中char定义时候是单引号,和双引号有区别,因为在java中双引号带表的是string,这个和python不一样。
8.java中的字符串连接用+号python也可以,但是我喜欢用format方法,java中的字符串是不可变的,这一点和python一致(下图来自廖雪峰的java教程)
image.png
通过这个复习一下python的可变数据和不可变数据:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
9.java中的引用类型的变量可以指向一个空值null,它表示不存在,也就是该变量不指向任何对象,null和空字符串“”不一样的,在java中空字符串是一个有效的字符串对象,python中None和“”也是不一样的
10.java中的数组只能放同一类型的变量相比之下python就可以放不同的类型,除此之外区别还是很大的,java的数组长度不可变,所以java在定义数组时需要定义数组长度;相比之下python的list长度就是可变的,从这个角度来说java的数组更像python中的tuple。
语法对比:
java:int[] ns = {68,79,91,85,62}
Python : ns = [68,79,91,85,62] or ns =(68,79,91,85,62)
(下图来自廖雪峰的java教程,其实在java中引用类型都是这样的,包括数组中时string这种引用类型也是一样的,就不举例子了)
image.png
流程控制
输入输出:
1.java的格式化功能提供各种展位符,这一点和python一致,(难怪好多人在python中都喜欢用“%s”,“中”,是从java习惯过来的吗?,相比而言我还是用format多一点)除了%s之外还有%d,%f,%e,%x
if,switch选择:
1.和python的 写法不同
java:
if (n >60){
System.out.print("及格了")
}
python:
if n>60:
print("及格了")
2.java中的if…else if…类似于python中的 if…elif…
3.java中的==不能用在引用类型的内容相等上,python可以,所以在java里要进行string的值比较的时候要用equals(),注意空指针异常,所以把非空指针的内容放到前头
4.switch是python中没有的东西要记住break在条件ok的时候跳出
5.java12中switch写法已经修改了,如下:
switch (fruit) {
case "apple" -> System.out.println("Selected apple”);}
用->替代了:可以不用写break
while和do while:
1,java中的while和python基本一样
2,python中没有do while,但是可以用while 加break来完成
3,python的for循环可以数字还可以循环一个迭代器,比如循环一个list,一个自定义迭代器,相对于python而言java有for 数字之外还有一个for each可以遍历所有可迭代的数据类型写法如下,这些在python里都以及在for里实现了。enumerate的用法也很强大。
for (int n: ns){
System.out.print(n)
}
数组操作
1.在java中打印数组需要用到Arrays.toString(ns),打印多维数组时需要用到Arrays.deeptoString(ns)有点麻烦啊。相对于而言python可以直接打印。
2.Java中使用数组操作时候使用for each的时候无法拿到索引的,相比之下python的enumerate就好用很多了。
3.在使用java自定义的Arrays.sort(ns);后整个数组在内存中已经变了如下图所示:
image.png
4.java有一个命令行参数,是属于main方法的,
java的面相对象
1.java里有filed的概念,就是类的参数,一般有public和private的区分,public是外界可以访问的,private是当前类私有的,外界无法访问,需要用来自己定义get和set方法来进行存取,除此之外还有构造方法,不同的参数传递要写不同的构造方法,相同的在python中就简单很多,python中只需要在init里定义加上init方法里用参数等于的方式,在对象实例化时进行赋值就好了。
2.和python不同的是java在定义方法时需要定义返回类型,然后return要和它保持一致
3.java的this有点类似于python的self关键字
4.因为java对数据的类型是比较在意的,所以定义方法参数时需要定义参数类型
5.java的可变参数是用类型加三个点来实现的,string…names的方式 类似于python中的*args
6.基于冗长的构造方法可以传递不同的参数,Java也就有了方法重载,这个是相对于python没有的东西,体现到平时的工作中就是方法名字可以重复,通过传递参数来区分调用,但是python可以在一个方法里来写,这样一个方法会越写越胖其实是不适合多人开发的,但是幸好python有装饰器可以在一定程度上解决这个问题。
7.类似于python,Java也有继承,java的继承是基于关键字extends,父类的private的方法子类无法继承,所以又有了protected字段,子类在定义构造方法时需要用到super(),如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法,而同时在python中只需要写一行父类的init就好了
8.java中可以使用重写和覆写,重写是基于一个方法中的,覆写是在继承关系里使用的。
9.多态是java中很有意思的东西,python好像也有但是conner我没有用过,看了几个例子,大致的总结是多态是根据实例化的不同子类,来调用不同子类的相同方法,有点switch 或者if…else的味道。但是这个是针对方法的。
10.参数有final来将其生成为常量,同样也可以来修饰方法,被修饰的方法子类是不允许将其覆写的。同样这个关键字也可以用来修饰class,被修饰的class不可以被继承。
11.抽象类,作用就是父类某个方法需要用到但是本身不需要实现任何功能,仅仅是为了使用到多态,可以考虑用到抽象类,使用abstract来修饰该方法,此时class也需要用abstract变成抽象类
12.在抽象类之上还有更抽象的东西叫做接口,接口定义时候用关键词interface,然后用具体的类去实现一个接口的时候需要用的关键字是implement来取代extends,一个类只能继承一个类,但是他却可以实现多个接口。但是interface可以实现另一个interface用extends来实现。
13.静态字段和静态方法,
静态字段可以理解为属于类的属性,类似于python中的全局变量。静态方法是不需要实例化可以直接用类的方式来调用
14.java的包类似于python的文件夹,包之间没有父子的关系java.util与java.util.zip是不同的包,两者之间没有任何继承关系,而在pyhton中的.就是继承的关系。同一个包之下不同的类的调用是不用导包的,不同的包之下需要导包。
15.一个.java文件只能有一个public的class类,这个就有点坑了,但是可以有其他类型的类比如默认类型。