一、java介绍
1.Java语言的特点
面向对象
面向对象(OOP)就是Java语言的基础,也是Java语言的重要特性。面向对象的概念:生活中的一切事物都可以被称之为对象,生活中随处可见的事物就是一个对象,我们可以将这些事物的状态特征(属性)以及行为特征(方法)提取并出来,并以固定的形式表示。
简单好用
Java语言是由C和C++演变而来的,它省略了C语言中所有的难以理解、容易混淆的特性(比如指针),变得更加严谨、简洁、易使用。
健壮性
Java的安全检查机制,将许多程序中的错误扼杀在摇蓝之中。 另外,在Java语言中还具备了许多保证程序稳定、健壮的特性(强类型机制、异常处理、垃圾的自动收集等),有效地减少了错误,使得Java应用程序更加健壮。
安全性
Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击,从而可以提高系统的安全性。
平台无关性
Java平台无关性由Java 虚拟机实现,Java软件可以不受计算机硬件和操作系统的约束而在任意计算机环境下正常运行。
支持多线程
在C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持。多线程机制使应用程序在同一时间并行执行多项任务,该机制使得程序能够具有更好的交互性、实时性。
分布式(支持网络编程)
Java语言具有强大的、易于使用的网络能力,非常适合开发分布式计算的程序。java中提供了网络应用编程接口(java.net),使得我们可以通过URL、Socket等远程访问对象。
编译与解释共存
Java 是编译与解释共存的语言
2.Java语法基础
标识符
用来标识类名、对象名、变量名、方法名、类型名、数组名、文件名的有效字符序列。
合法的标识符
由字母、数字、下划线“_”、美元符号“$”或者“¥”组成,并且首字符不能是数字。
不能把java关键字和保留字作为标识符。
标识符对大小写敏感。
关键字
Java语言中已经赋予了特定含义的
保留字
const、goto,Java版本中尚未使用,但以后版本可能会作为关键字使用
变量
程序运行期间可以被改变的量。在程序中使用变量,必须先创建它并为它取一个名字,并且指明它能够存储信息的类型,这称为“变量声明”,也叫容器的创建。
变量的使用
变量的声明:数据类型 变量名;
变量的赋值:变量名 = 数据;
变量的操作:放入打印语句进行输出或者进行运算
Java 中的注释
单行注释
多行注释
文档注释
二、提升代码质量的技巧
1.使用有意义的命名:为类名、变量名、方法名等使用描述性的名称,使代码易于阅读和理解。
示例:
// 不推荐:
int a;
// 推荐:
int studentAge;
2.遵循编码规范:遵循统一的编码规范,例如Java编码规范 (Java Code Conventions)。
遵循编码规范可以提高代码的可读性和可维护性。以下是一些遵循Java编码规范的示例:
(1)类名应使用驼峰命名规则,并以大写字母开头。
public class EmployeeRecord {
// 类的成员和方法
}
(2)方法名和变量名应使用驼峰命名规则,首字母小写。
public void calculateSalary() {
// 方法的实现
}
int numberOfStudents;
(3)常量名应使用全部大写字母,并用下划线分隔单词。
public static final int MAX_STUDENT_COUNT = 50;
(4)使用缩进(一般为4个空格)来表示代码块的层次结构。
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
System.out.println("偶数: " + i);
} else {
System.out.println("奇数: " + i);
}
}
(5)使用花括号来明确代码块的开始和结束,并确保代码的风格一致。
if (condition1) {
// 逻辑1
} else if (condition2) {
// 逻辑2
} else {
// 默认逻辑
}
(6)在二元操作符之间使用空格,使代码更易读。
int sum = num1 + num2;
int product = num1 * num2;
(7)使用注释来解释代码的意图、实现方式或注意事项。
// 计算并返回两个数的和
public int add(int num1, int num2) {
return num1 + num2;
}
3.注释清晰明了:使用注释解释代码的功能、目的和实现方式,方便他人理解和维护代码。
示例:
// 计算并返回两个数的和
public int add(int num1, int num2) {
return num1 + num2;
}
4.编写简短而功能单一的方法:确保方法只有一个明确的功能,提高方法的可读性和可维护性。
编写简短而功能单一的方法可以将代码逻辑拆分为更小的部分,提高代码的清晰度和可维护性。以下是一个示例:
public class Calculator {
public int add(int num1, int num2) {
return num1 + num2;
}
public int subtract(int num1, int num2) {
return num1 - num2;
}
public int multiply(int num1, int num2) {
return num1 * num2;
}
public int divide(int num1, int num2) {
if (num2 == 0) {
throw new IllegalArgumentException("除数不能为零");
}
return num1 / num2;
}
}
在上面的示例中,每个方法都只完成一个特定的数学运算,例如add方法用于执行加法操作,multiply方法用于执行乘法操作等。每个方法的功能明确,易于理解和维护。
如果将所有的运算逻辑都放在一个方法中,代码可能会变得冗长且难以阅读。通过将其拆分为多个简短的方法,可以使代码结构更清晰,同时也可以更方便地测试和重用这些独立的功能。
5.避免使用魔法数值:将常量或魔法数值定义为易于理解的变量,提高代码的可读性和可维护性。
示例:
// 不推荐:
if (score > 60 && score < 90) {
// do something
}
// 推荐:
int passingScore = 60;
int excellentScore = 90;
if (score > passingScore && score < excellentScore) {
// do something
}
6.处理异常并提供有意义的错误信息:避免捕获异常后忽略或无操作的情况,提供清晰明了的错误信息以便快速定位问题。
示例:
try {
// 可能抛出异常的代码
} catch (Exception e) {
logger.error("处理数据时出现错误:" + e.getMessage());
}
7.使用合适的数据结构:根据实际需求选择合适的数据结构,例如使用ArrayList代替数组,使用HashMap代替线性搜索等。
(1)使用ArrayList代替数组:
当需要处理可变长度的数据集合时,ArrayList是一种更常用的选择,因为它具有动态分配内存的能力,并且提供了许多有用的方法来操作集合数据。
import java.util.ArrayList;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
System.out.println(names); // 输出: [Alice, Bob, Charlie]
}
}
(2)使用HashMap代替线性搜索:
当需要根据键快速查找值时,HashMap是一种高效的数据结构。相比于线性搜索,HashMap可以通过哈希算法快速定位值,提供了更高的查找效率。
示例:
import java.util.HashMap;
import java.util.Map;
public class Example {
public static void main(String[] args) {
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 90);
scores.put("Bob", 80);
scores.put("Charlie", 95);
int score = scores.getOrDefault("Bob", 0);
System.out.println("Bob的成绩是:" + score); // 输出: Bob的成绩是:80
}
}
在实际开发中,根据具体需求选择合适的数据结构非常重要。例如,如果需要按照插入顺序访问元素,可以使用LinkedHashMap;如果需要保证唯一性,可以使用HashSet等。使用适当的数据结构可以提高代码的性能,并使代码更易于理解和维护。
三、基础案例分享
1.数值拆分
需求:一个三位数,将其拆分为个位、十位、百位后,打印在控制台
2.求三个整数的最大值
需求:定义三个整数,找出最大值并打印在控制台
分析
1.用三元运算符获取前两个整数的最大值, 并用临时变量保存起来
num1 > num2 ? num1 : num2;
2.用三元运算符,让临时最大值和第三个整数进行比较,并记录结果
temp > num3 ? temp : num3;
3.输出结果
3.键盘录入
需求:请完成Java程序与用户交互,比如录入用户输入的名称、年龄。
4.求和
需求:求1-5之间的数据和,并把求和结果在控制台输出
分析:
1.定义for循环使其能够依次访问到1、2、3、4、5.
2.在循环外定义一个整数变量sum用来累加这些数据
3.循环结束后,输出求和变量即是结果
public class Sum {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <=5 ; i++) {
sum+=i;
}
System.out.println("1-5的和是"+sum);
}
}
5.元素搜索---学生信息系统的数据搜索
需求:后台程序需存储学生信息并展示,然后要提供按学号搜索学生信息的功能
分析:
1.定义Student类,定义ArrayList集合存储学生对象信息,并遍历出来
2.提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生信息,并展示
3.使用死循环,让用户可以不停的搜索
public class Student {
private String studyNumber;
private String name;
private int age;
private String className;
public Student() {
}
public Student(String studyNumber, String name, int age, String className) {
this.studyNumber = studyNumber;
this.name = name;
this.age = age;
this.className = className;
}
public String getStudyNumber() {
return studyNumber;
}
public void setStudyNumber(String studyNumber) {
this.studyNumber = studyNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
public class Test {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("20180302", "叶孤城", 23, "护理一班"));
students.add(new Student("20180303", "东方不败", 23, "推拿二班"));
students.add(new Student("20180304", "西门吹雪", 26, "中药学四班"));
students.add(new Student("20180305", "梅超风", 26, "神经科二班"));
System.out.println("学号\t名称\t年龄\t班级");
for (int i = 0; i < students.size(); i++) {
Student s = students.get(i);
System.out.println(s.getStudyNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());
}
//按照学号搜索功能
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请您输入学号查询学生对象");
String studentNumber = sc.next();
Student s = getStudentById(students, studentNumber);
if (s != null) {
System.out.println(s.getStudyNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());
} else {
System.out.println("查无此人");
}
}
}
/**
* 根据学生的学号查询学生对象赶回
*
* @param students 存储全部学生对象的集合
* @param studyNumber 搜索的学生的学号
* @return 学生对象|null
*/
public static Student getStudentById(ArrayList<Student> students, String studyNumber) {
for (int i = 0; i < students.size(); i++) {
Student s = students.get(i);
if (s.getStudyNumber().equals(studyNumber)) {
return s;
}
}
return null;
}
}