前言
在看思路整理内容时,需要有一定的java基础,建议先阅读相关书籍,具有一定编程经验后再阅读本文。
变量
定义变量时需要指定数据类型,并使用赋值运算符“=”给变量赋值。
时常需要注意变量为空的情况,建议开发时反复检查代码逻辑,尽量避免不必要的异常情况。
数据类型
Java的基本数据类型包括整型、浮点型、字符型、布尔型等。
在Java中,需要将数据类型分为两类:基本数据类型与引用数据类型
基本数据类型
整型(byte、short、int、long)
浮点型(float、double)
字符型(char)
布尔型(boolean)
Java的基本数据类型都有默认值。默认值指的是在没有明确赋值的情况下,变量会被自动赋予的一个默认值。
Java的基本数据类型的默认值如下:
byte、short、int、long:0
float、double:0.0
char:‘\u0000’(空字符)
boolean:false
需要注意的是,这些默认值只适用于类的成员变量,而不适用于局部变量。对于方法中的局部变量,如果没有明确赋值,编译器会给出一个编译错误,必须先初始化再使用。
引用数据类型
Java中的引用数据类型包括:
类(Class)
接口(Interface)
数组(Array)
基本数据类型是Java语言中的基础数据类型,是在Java虚拟机中直接存储的。引用数据类型是指存储在堆中的对象,每个对象都有一个对应的引用。
如何理解引用>
对象可以包含其他对象的引用作为其属性。这些引用指向其他对象的地址,并允许程序访问那些对象。简单来说,一个对象的属性可以是另一个对象。
例如,假设我们有一个Person类和一个Address类,其中Person类的一个属性是Address类型的引用:
public class Person {
private String name;
private Address address;
// constructor, getters and setters
}
public class Address {
private String street;
private String city;
private String state;
private String zipCode;
// constructor, getters and setters
}
//我们默认提供一个全量构造器与get、set方法
在这个例子中,Person对象包含一个Address类型的属性address,该属性是一个引用。当我们创建一个Person对象时,可以将一个Address对象作为参数传递给Person的构造函数,从而将其地址存储在Person对象的address属性中。
Address address = new Address("123 Main St", "Anytown", "CA", "12345");
Person person = new Person("John Doe", address);
这样,我们可以通过访问Person对象的address属性来访问Address对象。例如,可以通过person.getAddress()方法获取Person对象的地址,然后通过访问Address对象的getCity()方法获取该地址的城市名。
引用在Java中是一种非常重要的概念,它使得我们能够在对象之间建立关联,并允许我们编写复杂的程序。但是,需要注意的是,如果在操作对象的时候不小心处理了引用,可能会导致不可预期的结果和内存泄漏等问题。因此,在处理对象引用时需要小心谨慎。
如何理解内存泄漏>
内存泄漏指的是程序中存在已经不再使用的对象或资源,但是这些对象或资源没有被垃圾回收器回收,导致内存中的可用空间越来越少,最终可能会导致程序的崩溃或者严重的性能问题。
内存泄漏通常发生在程序中存在着一些不合理的编程习惯或错误的设计,比如:
- 对象被创建后没有被正确地销毁
- 对象被创建后被存放在容器中,但是容器没有被清空
- 对象被创建后与其他对象形成了循环引用,导致这些对象无法被垃圾回收器回收
- 为了避免内存泄漏,开发者需要遵循一些基本的编程原则:
严格遵循内存管理规范,确保对象在不再使用时及时被销毁
- 避免使用静态变量和全局变量,这些变量可能会在程序的整个生命周期内一直存在,导致内存泄漏
- 避免过度创建对象,尽可能地重用对象
- 当使用容器时,一定要确保容器在不再使用时及时被清空
- 避免对象之间形成循环引用
如何理解销毁对象>
正确销毁对象的过程包括两个步骤:解除引用和调用垃圾回收。
- 解除引用:在程序中手动将对象引用赋值为 null,或者超出该对象的作用域,使该对象的所有引用都被释放。
- 调用垃圾回收:垃圾回收是 JVM 自动进行的,程序员无法控制具体的回收时间。但是,可以通过 System.gc() 方法来强制启动垃圾回收,这仅仅是通知垃圾回收器执行回收操作,并不能确保回收一定会在该方法被执行后立即进行。
需要注意的是,Java 的垃圾回收机制并不是完美的,有些情况下还是会出现内存泄漏问题。因此,在编写 Java 程序时,应该尽可能地减少对象的创建,以及避免在循环中创建对象等容易导致内存泄漏的操作。另外,程序员还可以使用一些内存分析工具来检测程序中的内存泄漏问题,并进行优化和调整。
目前我在工作情况遇到的内存泄漏问题很少,仅能通过ai进行此类名词解释,遇到内存泄漏的问题已经很久远,新手程序员通常会在一个死循环中遇到omm问题,需要及时发现调整。
运算符
Java中的运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等。
- 算术运算符:用于执行加减乘除等基本数学运算,例如加号(+)、减号(-)、乘号(*)、除号(/)、取模(%)等。
- 赋值运算符:用于给变量赋值,例如等号(=)、加等于(+=)、减等于(-=)、乘等于(*=)、除等于(/=)等。
- 比较运算符:用于比较两个变量的大小关系,例如等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。
- 逻辑运算符:用于连接多个表达式,例如逻辑与(&&)、逻辑或(||)、逻辑非(!)等。
- 位运算符:用于对整数类型的数据进行位操作,例如按位与(&)、按位或(|)、按位异或(^)、取反(~)等。
- 条件运算符:也称为三目运算符,用于简化if-else语句,例如 ? : 。
- instanceof 运算符:用于判断一个对象是否是某个类的实例。
通常情况下很难用到位运算符,其他运算符已经足够我们在写需求中使用,因为位运算符通常用于对二进制数据进行处理。但是,在某些情况下,位运算符可以提高代码的效率或实现某些特定的功能。例如,可以使用位运算符将一个整数转换为二进制字符串,或者对一些算法进行优化。
在实际开发中,如果需要使用位运算符,可以在代码中注释清楚其作用和用法,以便其他开发者理解代码的意图。同时,也需要注意位运算符的优先级和结合性,避免出现意想不到的结果。
位运算符是用于操作二进制数的运算符,包括位与(&)、位或(|)、位异或(^)、取反(~)、左移(<<)、右移(>>)和无符号右移(>>>)
在两个二进制数比较时 可以与位置相对应进行比较,与或非这三个名词是我们经常能听到的词,一般的开发情况也只会用到这三种运算方式。
以下做一些位运算符的使用情形:
注:0b是Java语言中表示二进制数的前缀,在java语言中,二进制的最高位,也就是除了前缀0b最左边的那一个数字代表的是数字的正负,0为正,1为负
位与(&):用于将一个数的指定位设为0。例如,可以使用该运算符清除二进制数的低位。
int a = 0b1111;
int b = 0b0011;
int c = a & b;
// c = 0b0011
位或(|):用于将一个数的指定位设为1。例如,可以使用该运算符将二进制数的低位设为1。
int a = 0b1100;
int b = 0b0011;
int c = a | b;
// c = 0b1111
位异或(^):用于将一个数的指定位取反。例如,可以使用该运算符将二进制数的低位取反。
位异或运算符(^)是一种二进制运算符,用于对两个二进制数的每一位进行比较,如果相同则为0,不同则为1。例如,如果我们有两个二进制数1010和1101,它们进行位异或运算的结果为0111。
int a = 0b1100;
int b = 0b0011;
int c = a ^ b;
// c = 0b1111
取反(~):用于将一个数的所有位取反。例如,可以使用该运算符将二进制数的所有位取反。
int a = 0b1100;
int b = ~a;
// b = 0b0011
左移(<<):用于将一个数的二进制位向左移动指定的位数。例如,可以使用该运算符将二进制数左移一位。
int a = 0b0011;
int b = a << 1;
// b = 0b0110
右移(>>):用于将一个数的二进制位向右移动指定的位数,移动时保留符号位。例如,可以使用该运算符将二进制数右移一位。
int a = 0b1100;
int b = a >> 1;
// b = 0b0110
无符号右移(>>>):用于将一个数的二进制位向右移动指定的位数,移动时不保留符号位。例如,可以使用该运算符将二进制数无符号右移一位。
int a = 0b1100;
int b = a >>> 1;
// b = 0b0110
位运算符常常被用于加密算法中。位运算具有快速且高效的特点,能够帮助加密算法处理大量的数据,提高加密速度和效率。例如,在AES(Advanced Encryption Standard)加密算法中,就运用了大量的位运算符进行加密和解密操作。另外,哈希算法和消息摘要算法也经常使用位运算符进行数据处理。
举个简单加密例子:
public class BitwiseEncryption {
// 加密密钥
private static final int ENCRYPTION_KEY = 0b10101010;
// 加密算法
public static int encrypt(int value) {
return value ^ ENCRYPTION_KEY;
}
// 解密算法
public static int decrypt(int value) {
return value ^ ENCRYPTION_KEY;
}
public static void main(String[] args) {
int original = 123456789;
int encrypted = encrypt(original);
int decrypted = decrypt(encrypted);
System.out.println("Original: " + original);
System.out.println("Encrypted: " + encrypted);
System.out.println("Decrypted: " + decrypted);
}
}
在这个例子中,我们定义了一个加密密钥 ENCRYPTION_KEY,它是一个二进制数,也就是 0b10101010。然后我们实现了两个方法,encrypt 和 decrypt,分别用来加密和解密数据。加密算法的实现很简单,就是使用位异或运算符(^)对原始数据进行加密。解密算法的实现和加密算法的实现是一样的,因为异或运算符具有对称性,也就是说 a ^ b ^ b = a。
在 main 方法中,我们定义了一个原始数据 original,然后分别对它进行加密和解密操作,并输出结果。你可以自己尝试修改原始数据和加密密钥,看看加密和解密的结果是否正确。
控制流语句
Java中的控制流语句包括条件语句、循环语句等。
- if语句:用于根据给定的条件执行不同的代码块。
- switch语句:用于根据不同的情况执行不同的代码块。
- while循环:用于重复执行一段代码,直到给定的条件不再满足。
- do-while循环:与while循环类似,但是它保证代码块至少执行一次。
- for循环:用于重复执行一段代码,指定循环变量的起始值、结束值和步长。
- for-each循环:用于遍历数组或集合中的元素。
- break语句:用于跳出循环或switch语句。
- continue语句:用于跳过当前循环的剩余代码,开始下一次循环。
- return语句:用于从方法中返回值,并结束方法的执行。
方法
在Java中,方法是一段可执行的代码,通常被用于执行特定的任务或操作。方法可以看作是一种封装,它把一段可重用的代码块打包起来,并可以在需要的时候被调用。
在Java中,方法由许多组成部分组成,包括方法名、参数列表、返回值类型、方法体等。方法名是用来唯一标识方法的名称,参数列表指定了方法需要传入的参数,返回值类型指定了方法的返回值类型,方法体则是包含了实际执行的代码。
Java中的方法可以通过调用语句来执行,例如:
public int add(int a, int b) {
int sum = a + b;
return sum;
}
// 调用add方法
int result = add(3, 4);
在这个例子中,我们定义了一个名为add的方法,它有两个整型参数a和b,返回类型是int。在方法体中,我们将a和b相加,将结果赋值给变量sum,并返回sum的值。在调用add方法时,我们传入参数3和4,并将结果保存在result变量中。
类和对象
在Java中,类是指一类具有相同属性和行为的对象的模板。对象则是类的实例,也就是根据类创建的具体个体。可以把类看作是一张图纸,而对象则是按照这张图纸所制造出来的物品。类定义了对象的属性和方法,对象则通过调用这些方法来实现特定的行为和功能。
举个例子,如果你要定义一个汽车类,这个类可能包含汽车的属性(如品牌、型号、颜色、价格等)和方法(如启动、加速、刹车、换挡等)。一旦你定义了这个类,你就可以创建该类的多个对象,每个对象代表一个具体的汽车,具有各自的属性和方法。
类和对象是面向对象编程中的基本概念,通过将代码组织成类和对象的形式,可以更好地组织和管理代码,并使代码更易于复用和维护。
异常处理
Java异常处理是指在程序执行过程中,出现了一些错误或异常情况,导致程序无法正常执行时,程序会抛出异常对象来表示这种异常情况。Java中提供了一套完整的异常处理机制,使得开发人员可以更好地处理这些异常情况,保证程序的稳定性和健壮性。
Java中的异常是一种对象,它包含了异常的类型、原因和位置等信息。当程序出现异常时,就会创建一个异常对象并抛出,开发人员可以通过捕获异常对象并进行处理来防止程序崩溃。
在Java中,异常分为受检查异常(Checked Exception)和非受检查异常(Unchecked Exception)。受检查异常必须在代码中显式处理,否则代码无法编译通过;而非受检查异常则不需要显式处理,但如果不处理可能会导致程序崩溃。
Java中的异常处理机制主要包括try-catch-finally语句和throws关键字。try-catch-finally语句用于捕获和处理异常,而throws关键字则用于声明方法可能抛出的异常,将异常抛给调用者处理。
Java中的异常非常多,根据Java中的异常分类,可以将异常分为三类:Checked Exception(受检异常)、Unchecked Exception(非受检异常)、Error。其中,RuntimeException属于Unchecked Exception,因为Java编译器在编译时不会对这类异常进行强制检查,而是在运行时才会发现异常。
Error(错误)
Java中的Error类是Throwable类的子类,用于表示系统错误或异常,通常无法通过捕获异常处理,必须在程序中进行修复或调整。常见的Error包括:
- VirtualMachineError(虚拟机错误):OutOfMemoryError(内存溢出)、StackOverflowError(栈溢出)等。
- AssertionError(断言错误):通常用于程序内部检查,如果断言失败,则抛出该错误。
- OutOfMemoryError:表示Java虚拟机没有足够的内存来为应用程序分配对象。
- StackOverflowError:表示应用程序递归调用的层数过多,导致栈空间溢出。
- NoClassDefFoundError:表示JVM在加载某个类时找不到该类的定义。
- UnsatisfiedLinkError:表示在JVM调用本地方法时找不到指定的本地库文件。
Exception(异常)
- IOException(输入输出异常):如FileNotFoundException(文件未找到)、EOFException(读取文件结束)等。
- SQLException(数据库访问异常):如SQLSyntaxErrorException(SQL语法错误)、SQLTimeoutException(SQL执行超时)等。
- ClassNotFoundException(类未找到异常):如果类不存在,则抛出该异常。
InterruptedException(中断异常):当线程等待、休眠、阻塞时,如果另一个线程中断它,则抛出该异常。 - NoSuchMethodException(方法未找到异常):如果调用的方法不存在,则抛出该异常。
- NoSuchFieldException(字段未找到异常):如果访问的字段不存在,则抛出该异常。
- IllegalAccessException(非法访问异常):如果程序试图访问或修改一个私有的方法或字段,则抛出该异常。
- InstantiationException(实例化异常):如果试图通过Class.newInstance()方法实例化一个抽象类或接口,则抛出该异常。
- RuntimeException(运行时异常):如NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组下标越界)、ArithmeticException(算术异常)等。
RuntimeException(运行时异常)
- NullPointerException(空指针异常):当应用程序试图通过空引用访问对象的属性或调用对象的方法时,抛出该异常。
- ArrayIndexOutOfBoundsException(数组下标越界异常):当应用程序试图访问超出数组范围的元素或为负数时,抛出该异常。
- ClassCastException(类型转换异常):当试图将一个对象强制转换为不是实例类型的类时,抛出该异常。
- IllegalArgumentException(非法参数异常):当方法中传入的参数不符合要求或不合法时,抛出该异常。
- ArithmeticException(算术异常):当出现除数为0的情况时,抛出该异常。
关于异常需要特殊情况特殊处理,在测试时要多加注意,尽量避免异常情况的发生,常见异常还是空指针异常,在调用类方法时记得判断类是否为空。
未经本人允许禁止转载,感谢关注。优快云 iumi