type
status
date
slug
summary
tags
category
icon
password
软工期末java
java概论
javac编译的是.java文件;而java解释的是.class文件
package语句是表明当前包是什么,只能有一条;import语句是指明要导入哪些包,可以有多条
如下图:
关于java应用程序以及小应用程序
小应用程序的执行步骤
即:
import语句的两种格式如上图(包是由一堆类或者接口组成的,包就相当于是类和接口的目录)
第一种是指定引入一个包中的某一个类(注意包名和类名之间是使用点链接的而不是使用斜杠);第二种是引入一个包中的所有类
所以在正常编写java代码的时候就直接使用星号进行导包即可
一个类文件中只能有一个类被声明为public,并且public修饰的类的类名必须作为当前java文件的文件名
注意主函数的写法
java采用unicode编码,该编码使用十六位编码
注意java中的空是null而不是大写的NULL
保留字的意思是标识符不能使用goto和const进行命名,但是这俩也不是java的关键字
java中的标识符命名规则大差不差,就是多了一个美元符号,可以在标识符的开头也可以在标识符的中间
数组是一个引用类型,所以是需要用new的
注意byte是整数类型,而字符类型是char,没必要使用byte来存储字符(字符是使用单引号包围起来的,双引号包围起来就算是字符串了)
字符串虽然是引用类型,但是不需要使用new来进行创建
java中没有无符号数
对简单变量(也就是非引用变量),他们的空间才声明的时候就被创建
对引用变量,声明的时候只是声明了一个指针,指针指向的空间需要在new的时候进行分配
访问对象的成员需要使用点运算符来获取,这个跟c语言的结构体取值是一样的
这里的常量应该指的是字面量(如:123、123L等)
java中十进制数不能以0开头,因为八进制数是以0开头的
所有的整数默认是int,浮点数默认是double,所以要小心这种变量的声明:float a=3.14,因为这个时候3.14是一个双精度浮点数,这个时候从大范围到小范围就需要进行强制类型转换了
单引号包围
就是显示为八进制数和十六进制数的意思,真是TM不讲人话
这个是跟c不一样的
在java中类的成员变量就相当于是这个类中的全局变量
变量的初始化值,要注意的是字符类型的初始化值是unicode编码为0的字符,布尔类型的初始化值是false,引用类型的初始化值是null
下面是运算符有限集的表,看看就好
注意除号使用这个斜杠
这个应该是按位取反的意思,去你的按位求补
上面讲这么多就是下面这一句话
注意三个右移才是无符号右移,无符号右移不论正数还是负数都是直接补0,有符号右移对负数而言是补1
关于三目运算符
新版的java的switch语句的表达式已经可以使用String类型了
switch语句的格式。注意switch(表达式)之后是需要加上花括号的
就是从break语句处直接跳出(continue语句是从continue处直接跳出当次循环)
do while语句的格式。注意while的后面有一个分号
break语句在循环中使用可以指定跳出哪一层循环
continue语句也是一样的
注意创建一个数组的时候需要使用new
还是选择第二种形式,也就是int[] a;而不是int a[]
数组的实例化
数组也可以像c语言一样直接进行赋值
所以java的多维数组是需要分层初始化的,也就是:
通过这个方法就可以创建出来一个锯齿数组
注意在java里面字符串就是一个单独的类了,而不是像c语言一样是一个字符数组
注意java的输入,这个也容易忘记
类可以是final的,表示他不能被继承,而且这些关键字好像还没有顺序要求
构造器的名字必须和类名是一致的,并且没有返回值类型的字段
通常都是将常量定义在接口中的,因为在接口中就不用写final了(接口中的变量默认是final的)
方法的定义格式(上面是没有加上访问权限控制修饰符的,比如public等)
当方法的返回值是void的时候,是可以没有return语句的
在java中也是值传递
这个时候对p是值传递,但是对p内的成员就是引用传递了
总而言之就是将实参的值拷贝给形参
方法过载是同一个类中有多个同名的函数(参数的顺序不同甚至也算是过载)
所以构造方法一定没有返回值
构造方法隐式返回这个类的对象
也就是static方法中只能调用static的成员
static的成员可以通过类名直接点
不能使用this和super是因为使用static的时候可能还没有对象被创建
static块只在类被加载时执行一次,而不是在对象创建时执行
GC回收的时候是调用对象的finalized方法
java中的类实际上就是一种数据类型(还记得编译中的数据类型的定义吗,数据类型是一组值和操作的集合)
通过super调用构造器必须在构造器的第一行捏,也就是上面的第二句话
抽象类必须有实例类,而final就不能被继承
成员继承是继承了,但是有的是没办法访问的,也就是下图:
就是运行时是从下到上来找最近的
方法覆盖的时候只有当访问权限更宽松的时候才能进行覆盖(也就是子类方法一定要比父类方法更宽松)
这个表示的是对当前类中的其他构造器的引用
所以super实际上就是一个对父类对象的引用(注意是对象而不是类,因为创建子类对象的时候实际上就已经初始化了一个父类对象)
所以实际上如果没有调用父类的构造器,编译器也会自己加上去一个super来对父类进行实例化(所以创建了一个子类对象就一定创建了一个父类对象)
所以要进行Person a= new Student();的时候,一定要保证调用的a的成员一定要在Person中存在(也就是编译看左边)
上图就是说—— 运行时看右边
这种就是这个变量只能被赋值一次,也就是在调用构造器时进行赋值
当函数的参数使用final修饰时,在函数内部就不能改变参数的值,这个跟c语言的函数参数是一样的
final方法是不会被子类覆盖的
也就是:如果成员抽象,类一定要抽象;如果类抽象,成员不一定抽象
抽象方法没有花括号,取而代之的是分号
这三种方法不能被定义为抽象
package语句是表示当前的类是属于哪一个包的
说明包里面是可以套包的(隔着套娃呢)
可以理解为*一定是正确的
不导包的话调用其他包里面的类的话就需要在前面加上包名,如上图中的最后一行
注意上面的子类指的是不同包中的非子类
接口中的方法都是抽象方法,接口中定义的量都是常量,即下图:
就像一个抽象类一样
就像父类一样,可以做到Person a=new Student();,其中Person是一个接口,即:
接口之间的继承(注意接口只能被接口继承)就跟类之间的继承没啥区别
唯一的区别是,接口可以进行多继承:
实际上使用的时候只需要注意接口的一点点特性即可,也就是都是抽象方法,都是常量,能够多继承即可
所以使用匿名类的时候实际上创建出来的对象是实际对象的子类
这里说的用People的一个子类创建对象是说这段代码创建出来的对象是People的一个子类对象
同理,上图中就是创建了一个接口的一个实例
其中Exception和RuntimeException就是编译时异常(就是写代码的时候就会报红)和运行时异常(就是程序执行时才可能出现异常)
通常是使用最后一个方法
自建异常的时候一般就是只实现这两个构造器(要背String的构造器捏)
抛异常的时候就不使用一个引用变量来接了,而是直接抛出,如下图:
异常捕获的格式
注意最后使用的是finally
try catch嵌套之后如果出现异常就会从内层开始比对,如果没有比对到的话跳到当前try catch的上一层继续尝试catch。如果当前没有catch到的话就继续向上层抛出异常
关键字throw是在代码块中抛出单个异常;而throws就是在方法上抛出所有该类型可能出现的异常
所以是可以直接抛出异常然后马上捕获的
实际使用的时候是可以两个一起写的(这样写也比较稳),如下图:
然后再在想要trycatch的地方进行catch
- 作者:Noah
- 链接:https://imnoah.top/article/Java
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。