java学习笔记(与python对比来学)

写在前头

原创不易转载请注名出处https://www.jianshu.com/p/cf36efbfe23b

自己之前一直是从事python的,因为部分业务要求需要进行Java的学习,顺道记录一点笔记。
不同在于Java是偏向编译性的语言,python是解释性语言(下面conner只针对java与python的不同点和相同点来对比学习)
学习java之前需要知道jdk,jre这些东西
jdk:java development kit
jre:Java runtime environment
jdk包括了jre

代码规范:

  1. 大小写敏感 与python一致;

  2. 类名首字母大写采用驼峰式 与python一致;

  3. 方法名小写字母开头后面每个词首字母大写 和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,十六进制的\u4e3d,所以在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类,这个就有点坑了,但是可以有其他类型的类比如默认类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343