JavaSE学习笔记 2

        距离上一次更新学习笔记已经过去好久了,并非是懈怠了,而确实是因为有不得不暂停学习一段时间的特殊原因,我也并非是想要向谁解释,只是想要表明一下我的决心,我是一定要学到最后的!话说回来,这次积攒的内容量虽然跟那么长时间的空档期对不上,但总归还是有一些的,其中关于类、对象以及构造方法方面的知识,我其实反复学习了一下,可是可能因为自己确实有点笨,脑海里总觉得自己对于这一部分的内容掌握的不够清晰,作业题没什么问题了,但是我自己内心仍然有许多疑问,或许是我长时间没有归纳总结吧,也想着透过这次久违地总结,让我能对最近所学的知识能够有一些初步地了解。废话不多说了,接下来进入正题吧。

        (一)方法

                ①方法基本概念

                Java的方法,类似于C语言的函数,但它跟函数或许又有本质上的不同,我在开头学习过程中,曾一度将方法直接视为函数,可是在学习过后面关于类和对象的知识后,我才知道方法更适合用“行为”这个词来替代,因为类是描述一个对象的属性、行为的,其中属性用成员变量表示,而行为自然就是通过方法表示,我也不知道我这种理解对不对,但是我现在认为方法就属于一种抽象上的,描述对象行为的一种方式。

                在实际应用过程中,方法倒确实跟函数很接近,不管是定义方法,使用上来说,都跟函数差不多,在未能对类和对象有所了解的情况下,将方法视之为函数也不失为一种选择。因为两者相似,所以方法也具有函数的对应优点,减少代码量,可重复调用,模块化代码等等。

                ②方法的定义方式

                方法的定义方式,大部分内容跟函数也是差不多的,形式如下:

修饰符  返回值类型 方法名(形参类型 形参名称,………………) {
    方法体
    return 返回值
}

                可以看到,如果将“方法”二字直接替换成函数,那么除开“修饰符”,实际上可以说是跟函数的定义方式一摸一样,而修饰符方面,又涉及到了权限方面的相关知识,由于相对复杂,这里先不讲,目前的修饰符可以考虑就是“public  static”。

                方法的定义跟函数的不同点也同样有很多,首先方法是没有所谓的方法声明一说的,其次方法必须要放在类的里面,并且不能嵌套方法定义,最后方法名的命名格式是小驼峰(首个单词的首字母小写,后续单词首字母大写)的格式,同类不同,类是大驼峰(所有单词首字母大写)。

                Java的方法运行过程跟函数很相似,有想了解的可以往直前C语言的学习笔记内查找相关内容,涉及到了栈帧的创建与销毁,这里简单说下整体过程,首先调用方法,传递实参的直接给形参(开辟空间将实参的值复制过去),然后执行方法体,得到返回值后,将返回值交给寄存器,回到调用该方法的方法内,下一条指令,同时通过寄存器,将返回值取回来,随后继续执行接下来的代码。

                这里注意一下,所以在C语言阶段,我们直接通过传址调用可以实现一个交换两个数数值的简单函数,但Java由于没有指针的说法,所以这种简单的方法我们是无法实现的,但是Java给出了另一种数据类型,也就是引用数据类型,引用数据类型的意思是,这个数据类型的变量内,存储的是一个引用(他所引用的对象地址),所以我个人认为引用变量就是Java内实质上替代指针的一种方式。虽然不能一概而论,但是引用数据类型确实如同指针一样,指向了一个对象。

                ③方法的重载与方法签名

                这是Java相对C语言函数,新增的一个特性,Java允许多个方法使用同一个名字,但要求每个方法的形参类型、数量不得相同,返回值则不做要求。程序会自动根据我们传进去的实参类型、数量去找到对应形参类型、数量的方法。

                那么Java是如何实现这一点的呢?

                实际上Java搞了一些小动作,Java当我么面一套,背地里又搞一套,在编译阶段,程序会给这些方法一个新的名字,大致是按照方法路径_参数列表_返回值类型来命名的,完成编译后,这些方法的名字自然就各异了,也就不存在冲突的问题了,并且程序华能找到对应的方法。

                至于最关键的一点,重载有什么用,举个例子,加入我们要定义一个方法,用于计算a + b的值,假如a和b的数据类型都是int,那么我先写了一个形参数据类型为int的add方法,那假如a 和 b类型是double呢?那我又得写一个add1的方法,再假如a 和 b 的数据类型为byte呢?那我又爹写一个add2的方法,当碰到这种情况时,方法体内的内容完全不变,仅仅因为实参的类型不一样,就需要写出多个方法,这么几个还行,假如是几十个呢?总不能写add20吧,这样在用的是偶都不知道哪个方法的形参为哪种类型,所以为了解决这种问题,采用方法重载就会简单许多,方法名全部一致,在计算时,会根据传入的实参类型,自动选择对应的方法。

        (二)递归思想

                实际上在C语言学习阶段,就已经学习过递归,递归是一种思想,不会因为语言的不同而产生什么影响,所以这里也不会铺开讲这部分内容。

                我依稀记得C语言阶段,我唯独没搞明白汉诺塔,好在通过这次的再学习,我倒是对汉诺塔有了一些理解,虽然我这边打出来的很简单,但跟跟自己能理解完全是两种情况,推荐看到的人都能自己去尝试理解,写一写代码,将汉诺塔的变动表达出来。

                假如将汉诺塔的三个柱子从左到右分别用A、B、C来表示。

                为方便理解,我们先假设柱子A上有一个铁环,我们要将一个铁环移动到C上,那么只需要一步,A -> C。

                那么假如是两个铁环呢?过程是A -> B , A -> C , B -> C。

                那么三个呢?过程是 A -> C , A -> B , C -> B , A -> C , B -> A , B -> C ,  A -> C

                透过上面的步骤,我们不难发现,当只有一个铁环的时候,我们需要将铁环直接移动到对应目标柱子即可;当有两个铁环的时候,我们需要借助另外一个柱子,将上面一个铁环移动到B,将最后一个铁环移动到C,最后将在B的第二个铁环移动到C;当有三个铁环时,我们先利用另外两个柱子,将除最后一个铁环以外的两个铁环移动到B,然后将最后一个铁环移动到C,最后再利用B柱子以外的铁环,将B移动到C。那么假如有n个铁环,那么只需要先将n - 1个铁环移动到B,在将最后一个铁环移动到C,然后利用另外两个柱子,将n - 1的铁环移动到C即可。这就是解析,如果能理解这个例子所讲,那么自然能理解汉诺塔的递归。

        (三)数组

                java的数组是一组相同数据类型元素的集合,这一点在C语言也是一样的,在虚拟机内,数组内数据的存放同样是连续的。

                ①数组的定义

                java数组的定义于C语言有相似,也有不同,在C语言的时候,定义一个数组是下面这个样子:

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int array[10];
int array[10] = {0};

                但java内有很大的不同,这里我们要搞清楚一个概念,引用数据类型的概念,什么是引用数据类型?引用数据类型指的是这种数据类型内,存放的是一个对象的地址,这个数据用来引用对应地址的对象,所以叫引用数据类型,用C语言的说法,大概用指针的说法会更好,但java的引用数据类型并没有C语言的指针那么神通广大。因为是引用数据类型,所以如果我们在定义了一个数组后,没有给这个数组赋值,那么会报错,因为这个引用内没有存放任何地址,如果存放null,则会给出空指针异常的报错信息。

                话说了那么多,那么java如何定义一个数组呢?定义方式如下:

int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] array = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] array = new int[10];

                 第一、第二种定义方式,都直接给出了数组内的元素内容,这种定义方式叫做静态初始化,跟C语言一样,如果一开始就直接给出了元素内容,那么程序会自己计算出这个数组的元素数量;第三种没有给出元素内容,但给出了元素的数量,这叫做动态初始化,不管是哪种初始化,数组内的元素都会有一个默认的值,大多为0,布尔类型则为false。这里提一嘴,静态初始化的第一种方式和第二种方式本质上是完全一样的,第二种是完整版,而第一种是简略版,简略版是由编译器在编译阶段,将这部分自动还原成第二种的样子,所以第一第二种在编译后,结果是一摸一样的。

                最后最后再提一嘴,java也允许我们像C语言一样去定义数组,但是不推荐那么做,不同语言有自己的特性,当使用对应语言的时候,还是按照对应语言的习惯来编写,以免产生歧义。定义数组的时候,也可以将之拆分成两步,但是静态初始化的第一种省略版格式是不允许拆分的。

                ②数组的使用

                数组元素的访问方面,对单个元素的访问方式,其实跟C语言差不多,都是采用那个方括号的运算符来进行访问,原理也是一致的,用法也是一致的。

                遍历数组的方式,Java与C语言相比,两者都可以通过一个经典遍历的代码来进行遍历,而Java则多了一个for-each的遍历方法,详见下方实例:

// C语言方法
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int len = sizeof(array) / sizeof(array[0]);
int i = -1;
for (i = 0; i < len; i++) {
    printf("%d ",array[i];
}
// -------------------------------------------------------
int[] array = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int i = -1;
// Java方法一
for (i = 0; i < array.length; i++) {
    System.out.print(array[i] + " ");
}

// Java方法二
for (int x : array) {
    System.out.print(x + " ");
}


// 上述所有代码的输出结果均为:1 2 3 4 5 6 7 8 9 10

                C语言的方法与Java方法一是基本一致的,而Java方法二就是for-each方法,是Java新增的遍历方式。注意一个细节就是Java并没有像C语言一样使用Sizeof运算符来计算数组长度,而是直接通过length得到长度,for-each则根本就没有这部分内容,可见Java在遍历数组方面比C语言简单一些。

                ③引用类型

                前面也反复强调过一个事情,那就是数组是引用数据类型,而不像byte、short、int、long、float、double、boolean、char是基本数据类型,最本质的区别就是,基本数据类型的变量,他们在内存空间内所储存的就是他们本身的值,而引用数据类型的变量,他们在内存空间所储存的值是他们所指的对象所在位置的地址,建议理解上,引用数据类型引用某个对象,可以近似看成是指针指向某个变量,这样或许更好理解一点。

                ④null

                Java内“null”表示空引用,含义是表示该引用不指向任何对象,要特别注意一点,Java不像C语言,规定了NULL是地址为0的内存;其次要注意大小写,Java内不存在NULL的写法,就是明确了空引用为null。在Java中,当尝试对一个空引用进行任何引用相关的操作时,都会发生空指针异常的报错。

        考虑到整体的篇幅问题,我决定把类和对象的内容放下一个笔记内,以上,就是最近所学的一部分知识了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值