java和python的比较-java学习笔记(与python对比来学)

写在前头

自己之前一直是从事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来比较):

cf36efbfe23b

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教程):

cf36efbfe23b

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教程)

cf36efbfe23b

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这种引用类型也是一样的,就不举例子了)

cf36efbfe23b

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);后整个数组在内存中已经变了如下图所示:

cf36efbfe23b

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类,这个就有点坑了,但是可以有其他类型的类比如默认类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值