JAVA基础
IDEA
感觉正式java之旅之前还是要先稍微了解IDEA的基本知识,不然很难进行下去。
创建项目前置知识
IDEA中最大的单位应该是project
可以理解为是workspace
然后是directory、module和package
package是JAVA类的命名空间 避免类名重复
加入我们创建com.Z1d10t 那么就会在本地创建嵌套的文件
这两个层级应该是一样的都是低于project 但是有些差异
module一般是我们用于构建源代码的文件夹,用于组织项目的不同部分
而directory是普通文件夹 就比如我们在电脑上普通的文件夹 没有特殊含义
在项目中常常用来放静态音视频图片之类的
然后我们就可以右击我们的module开始创建源文件进行创作了
project和module的关系
集成JVM
如果我们不用IDEA进行java开发的话,我们首先是创建.java
的源代码,然后通过javac.exe来编译为.class
后缀的文件才可以运行
但是IDEA直接集成了JAVA虚拟机也就是JVM,直接写完帮我们编译然后运行,非常方便。
这也就是为什么java有跨平台性,编译一次到处执行
就是因为JVM的原因,不用去看机器环境,自己就有一个环境,把自己包裹起来的呢种。
基本语法
编写 Java 程序时,应注意以下几点:
- 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
- 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass,也就是要驼峰式命名。
- 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
- 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
- 主方法入口:所有的 Java 程序由
public static void main(String[] args)
方法开始执行。
JAVA标识符
通俗说就是名字,类名变量名方法名都被称为标识符
- 字母数字美元符号或者下划线开头其他非法
- 关键字不能作为标识符 关键字就是一些已经被java占用的名字 有特殊含义的我们不能用
- 大小写敏感
JAVA修饰符
- 访问控制修饰符 : default, public , protected, private
- 非访问控制修饰符 : final, abstract, static, synchronized
可以用来修饰类中方法和属性
JAVA变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
JAVA数组
数组是储存在堆上的对象,可以保存多个同类型变量
JAVA关键字
https://www.runoob.com/java/java-basic-syntax.html 遇到了直接查表就行了
从HelloWorld开始
1 | public class HelloWorld { |
首先就是要需要梳理一个理念就是在java中一切都是类
psvm快捷键可以直接生成 public static void main(String[] args){}
sout快捷键可以直接生成System.out.println("hello world")
首先我们的文件名是什么那么我们的类名也是什么
public class 和 class的区别
也就是说我们可以创建多个类
但是公共类只能有一个并且公共类的类名必须与文件名保持一致
并且任何类中都可以设置程序入口 也就是都可以写main方法
但是虽然我们可以在一个java源文件中定义多个类,但是这种做法是不规范的,比较规范的是一个源文件只能定义一个class
注释
1 | //单行注释 |
JAVA对象和类
构造方法
如果没有显式构造方法 java编译器会为该类提供一个默认构造方法
一个类构造方法可以有多个
创建对象
1 | public class Student { |
访问实例变量和方法
1 | /* 实例化对象 */ |
eg:
1 | public class Student { |
import导包
首先在Z1d10t相对路径还有一个learn package
内容如下
然后我们导入到Z1d10t package中
然后调用 可见可以正常输出
基本数据类型
有内置数据类型和引用数据类型
内置数据类型
用到了直接查
https://www.runoob.com/java/java-basic-datatypes.html
引用类型
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用任何与之兼容的类型。
- 例子:
Student stu = new Student("byd");
常量
在程序运行时是不能修改的
在java中是用final来修饰变量的
1 | final double PI = 3.1415927; |
自动类型转换
小转大可以 但是大转小需要强制转换并且还会损失精度
JAVA变量类型
变量类型:
- 局部变量(Local Variables):定义在方法、构造方法或语句块中的变量,作用域只限于当前方法、构造方法或语句块中。局部变量必须在使用前声明,并且不能被访问修饰符修饰。
- 成员变量(Instance Variables):定义在类中、方法之外的变量,作用域为整个类,可以被类中的任何方法、构造方法和语句块访问。成员变量可以被访问修饰符修饰。
- 静态变量(Class Variables):定义在类中、方法之外的变量,并且使用 static 关键字修饰,作用域为整个类,可以被类中的任何方法、构造方法和语句块访问,静态变量的值在程序运行期间只有一个副本。静态变量可以被访问修饰符修饰。
- 参数变量(Parameters):方法定义时声明的变量,作为调用该方法时传递给方法的值。参数变量的作用域只限于方法内部 简单说就是函数用于传值的形参
参数变量
省流:形参
有两个点:
- 值传递:在方法调用时,传递的是实际参数的值的副本。当参数变量被赋予新的值时,只会修改副本的值,不会影响原始值。Java 中的基本数据类型都采用值传递方式传递参数变量的值。
- 引用传递:在方法调用时,传递的是实际参数的引用(即内存地址)。当参数变量被赋予新的值时,会修改原始值的内容。Java 中的对象类型采用引用传递方式传递参数变量的值。
类变量(静态变量)
java中静态变量是属于类的,而不是对象的实例
由于静态变量是与类相关的,因此可以通过类名来访问静态变量,也可以通过实例名来访问静态变量
JAVA修饰符
访问控制修饰符
直接用一张图片来看访问权限关系
默认访问修饰符default
默认访问修饰符的访问级别是包级别(package-level),即只能被同一包中的其他类访问
私有访问修饰符private
外部无法直接访问到 只能通过本类的public函数间接去访问
可见直接访问是会报错的
公有访问修饰符public
很常见就不说了 总之就是门户大开
受保护的访问修饰符protected
- 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问
- 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法
一般很少用 我在这里就不多说了
访问控制和继承
- 父类中声明为 public 的方法在子类中也必须为 public。
- 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
- 父类中声明为 private 的方法,不能够被子类继承。
非访问修饰符
static修饰符
- 静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
- 静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问
final修饰符
变量一旦赋值后,不能被重新赋值
final 修饰符通常和 static 修饰符一起使用来创建类常量
但是如果不用static那么就要用非静态函数才能调用 也就是不用static修饰的 不然会报错
可见无法被改变
abstract修饰符
一个类不能同时被final和abstract修饰
如果类包含抽象函数那么这个类一定要申明为抽象类 不然会报错
抽象类可以包含抽象方法和非抽象方法
抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供
如果有主体会报错
抽象方法由其子类实现
synchronized 修饰符
synchronized 关键字声明的方法同一时间只能被一个线程访问
transient修饰符
序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
1 | public transient int limit = 55; // 不会持久化 |
volatile修饰符
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
JAVA运算符
大致和其他语言差不多 就不过多赘述了
JAVA循环结构
while
1 | while( 布尔表达式 ) { |
do…while循环
1 | do { |
此结构会在判断条件是否成立之前执行一次 所以这个结构至少执行一次
for
1 | for(初始化; 布尔表达式; 更新) { |
JAVA增强for循环
1 | for(声明语句 : 表达式) |
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
continue和break
和其他语言利用一样 不多说
JAVA条件语句
same
JAVA数组
声明数组变量
两种方式但是一般推荐第一种方式
1 | dataType[] arrayRefVar; // 首选的方法 |
创建数组
1 | arrayRefVar = new dataType[arraySize]; |
做了两件事情:
- 首先用
new dataType[arraySize];
创建了一个数组 - 然后将其赋值给arrayRefVar
必须先声明然后再创建 如果不声明就创建会报错
实例
下标依然是从0开始
for-each循环
其实就是之前我们讲过的循环结构的增强for循环
多维数组
初始化
直接为每一维分配空间 这种我们用的最多也最方便
或者是一维一维分配空间
1 | type[][] typeName = new type[typeLength1][typeLength2]; |
JAVA正则
规则什么的都和其他语言差不多
看个例子
首先要引入依赖
然后要分别创建两个类:Pattern和Matcher
Pattern是要进行的匹配模式的对象
Matcher是被匹配内容的对象
其次还有一个点就是在java正则模式中转义要用//
其他语言我们都是只用一个/