期末课堂作业,以下内容为2024年上学期java课堂学习笔记
202402150705
Java 程序由以下几个部分组成:
包声明:定义类所属的包。
package com.example.myapp;
导入声明:导入需要使用的外部类。
import java.util.List;
import java.util.ArrayList;
类声明:定义Java类。
public class HelloWorld {
// 类体
}
主方法:程序的入口方法。
public static void main(String[] args) {
// 主方法体
}
成员变量:类的属性。
private String message;
构造方法:初始化对象。
public HelloWorld(String message) {
this.message = message;
}
成员方法:类的行为。
public void printMessage() {
System.out.println(message);
}
package com.example.myapp;
import java.util.List;
import java.util.ArrayList;
public class HelloWorld {
private String message;
public HelloWorld(String message) {
this.message = message;
}
public void printMessage() {
System.out.println(message);
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld("Hello, World!");
helloWorld.printMessage();
}
}
Java 提供了八种基本数据类型,每种数据类型都有特定的用途:
整型(整数类型):
byte
:8 位有符号整数。范围:-128 到 127。short
:16 位有符号整数。范围:-32,768 到 32,767。int
:32 位有符号整数。范围:-2^31 到 2^31-1。long
:64 位有符号整数。范围:-2^63 到 2^63-1。浮点型(小数类型):
float
:32 位单精度浮点数。
double
:64 位双精度浮点数。
字符型:
char
:16 位 Unicode 字符。范围:0 到 65,535。布尔型:
boolean
:表示两个值:true
或 false
。数据类型转换可以分为自动类型转换和强制类型转换:
自动类型转换(隐式类型转换):
int
可以自动转换为 long
,float
可以自动转换为 double
。强制类型转换(显式类型转换):
由高精度类型向低精度类型的转换,需要显式声明。
语法:(目标数据类型) 变量/值
。
例如:double
转换为 int
:
java
double d = 9.78;
int i = (int) d; // i 的值为 9
Java 提供了多种运算符,用于各种计算和逻辑操作:
+
加法; -
减法; *
乘法; /
除法; %
取余;==
等于; !=
不等于; >
大于; <
小于; >=
大于等于; <=
小于等于;&&
逻辑与; ||
逻辑或; !
逻辑非;&
按位与; |
按位或; ^
按位异或; ~
按位非; <<
左移; >>
右移; >>>
无符号右移=
赋值; +=
加并赋值; -=
减并赋值; *=
乘并赋值; /=
除并赋值; %=
取余并赋值顺序结构是程序最基本的控制结构。
程序中的语句按照它们在源代码中的顺序依次执行。
所有流程控制语句的默认执行方式都是顺序结构。
选择结构用于根据条件的真假来决定程序的执行路径。
if - else 语句:
if (condition) {
// 当条件为 true 时执行
} else {
// 当条件为 false 时执行
}
switch - case 语句:
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
// 可以有任意数量的 case 语句
default:
System.out.println("Invalid day");
break;
}
循环结构用于重复执行一段代码块,直到某个条件为假。
for 循环:
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
while 循环:
int i = 0;
while (i < 10) {
System.out.println(i);
i++;
}
do - while 循环:
int i = 0;
do {
System.out.println(i);
i++;
} while (i < 10);
跳转语句用于控制循环的执行流程或退出函数。
break:跳出当前循环或 switch 语句。
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 结束循环
}
System.out.println(i);
}
continue:跳过当前循环的剩余语句并进入下一次循环。
for (int i = 0; i < 10; i++) {
if (i == 5) {
continue; // 跳过剩余语句,继续下一次循环
}
System.out.println(i);
}
return:结束当前方法并返回一个值(如果方法的返回类型不是 void
)。
public int add(int a, int b) {
return a + b; // 返回 a 和 b 的和
}
数组是用于存储相同类型数据的集合。它使用一个单一变量名,通过索引来访问具体的元素。数组在内存中是连续存储的,每个元素占用相同的存储空间。
一维数组是最简单的数组类型。它可以通过两种方式进行初始化:
静态初始化:
int[] numbers = {1, 2, 3, 4, 5};
动态初始化:
int[] numbers = new int[5]; // 创建一个长度为5的数组,默认值为0
numbers[0] = 1;
numbers[1] = 2;
// 依次类推
访问一维数组的元素可以通过索引,索引从0开始。例如:
int firstNumber = numbers[0] //访问第一个元素
二维数组可以看作是数组的数组。它通常用于表示矩阵或表格数据:
初始化二维数组:
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 或者
int[][] matrix = new int[3][3]; // 创建一个3x3的矩阵
matrix[0][0] = 1;
matrix[0][1] = 2;
// 依次类推
访问二维数组的元素也通过索引。例如:
int element = matrix[1][2]; // 访问第二行第三列的元素
排序:可以使用 Arrays.sort()
方法对数组进行排序。
int[] numbers = {5, 3, 8, 1, 2};
Arrays.sort(numbers); // 对数组进行排序
查找:可以使用 Arrays.binarySearch()
方法在排序后的数组中查找元素的位置。
int index = Arrays.binarySearch(numbers, 3); // 查找元素3的位置
面向对象编程(OOP)是一种编程范式,它将程序设计任务分解为一组相互协作的对象。每个对象都是类的实例,类定义了对象的属性和行为。OOP的四大基本原则是:封装、继承、多态和抽象。
类是对象的蓝图,它定义了对象的属性(成员变量)和行为(成员方法)。
成员变量:用于存储对象的属性。
public class Person {
String name;
int age;
}
成员方法:用于定义对象的行为。
public class Person {
String name;
int age;
void introduce() {
System.out.println("Hello, my name is " + name);
}
}
对象是类的实例,通过 new
关键字创建。
Person person = new Person();
person.name = "Alice";
person.age = 30;
person.introduce();
构造方法用于初始化对象。它的名称与类名相同,没有返回类型。
public class Person {
String name;
int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
使用构造方法创建对象:
Person person = new Person("Alice", 30
this
关键字用于引用当前对象的实例。它常用于区分成员变量和局部变量。
public class Person {
String name;
public Person(String name) {
this.name = name; // 使用 this 来区分成员变量和局部变量
}
封装是面向对象编程的基本原则之一,它通过访问控制修饰符来保护对象的属性和方法。Java 提供了三种访问控制修饰符:
示例:
public class Person {
private String name; // 私有成员变量
protected int age; // 受保护成员变量
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
继承允许一个类从另一个类继承属性和方法,从而实现代码重用。
示例:
public class Animal {
public void eat() {
System.out.println("This animal eats food");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("This dog eats bones");
}
}
多态性允许一个接口被多种不同类型的对象实现,程序可以动态选择调用哪个方法实现。
示例:
public class MathOperation {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
Animal myDog = new Dog();
myDog.eat(); // 调用 Dog 类的 eat 方法
抽象类是不能被实例化的类,可以包含抽象方法,这些方法必须在子类中实现。
示例:
public abstract class Animal {
public abstract void makeSound(); // 抽象方法
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}
接口定义了一组方法,但不包含实现。类可以实现多个接口,从而支持多继承的特性。
示例:
public interface Animal {
void eat();
void sleep();
}
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("Dog eats");
}
@Override
public void sleep() {
System.out.println("Dog sleeps");
}
}
异常是程序在运行过程中发生的意外事件,通常是由程序错误或外部因素导致的。异常的处理是确保程序在发生错误时仍能正常运行的重要机制。
IOException
。NullPointerException
。OutOfMemoryError
。Java提供了 try - catch - finally
结构来处理异常,确保即使在异常发生时,程序也能继续运行或安全退出。
示例:
try {
// 可能发生异常的代码
int result = 10 / 0;
} catch (ArithmeticException e) {
// 处理异常
System.out.println("Cannot divide by zero");
} finally {
// 必定执行的代码
System.out.println("This block is always executed");
有时,需要创建自定义异常来表示特定的错误情况。可以通过继承 Exception
类或 RuntimeException
类来实现。
示例:
public class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
// 使用自定义异常
public class Main {
public static void main(String[] args) {
try {
throw new CustomException("This is a custom exception");
} catch (CustomException e) {
System.out.println(e.getMessage());
}
}
}