作者名称:纸飞机-暖阳
作者简介:专注于Java和大数据领域,致力于探索技术的边界,分享前沿的实践和洞见
文章专栏:Java那些年专栏
专栏介绍:本专栏涵盖了 Java SE从基础语法到面向对象编程,从异常处理到集合框架,从I/O流到多线程并发,再到网络编程和虚拟机内部机制等一系列编程要素
个人感慨:市面上关于JavaSE的学习路线或知识图谱很繁杂,学习起来比较费劲,Java知识体系非常庞大,刚接触阶段只需要关注部分重要的知识点基本可以入门,但是需要在Java这个领域或是行业深耕,还是需要时间以及精力慢慢沉淀,如今AI盛行,对于计算机从业者是冲击也是机遇,很喜欢的一句话:开始很难,但总比一直等待要强。
JavaSE详细学习路线图以及思维导图
【Java那些年系列-启航篇 01】史上最强JavaSE学习路线图 & 知识图谱
【Java那些年系列 04】 Java程序架构:深入理解类与对象的设计原则
01 代码组织
Java,作为一种面向对象的编程语言,以其强大的类库、跨平台能力和简洁的语法设计而广受欢迎。Java程序的结构基于类和对象的概念,其中类是创建对象的模板,方法是类的行为定义,变量则是状态的表示。为了编写出高效、可维护的Java程序,深入理解类、方法和变量的结构和用法至关重要。
1.1 类(Classes):Java程序的构建蓝图
1. 类的定义
类是Java程序中的基本构建块,它定义了一组具有相同属性和行为的对象。类的定义始于class
关键字,后跟类名和类体。类体中包含了类的属性(变量)和方法(函数)。
public class MyClass {
// 属性和方法的声明
}
2. 类的属性
属性是类的状态信息,通常用变量来表示。它们定义了对象的状态,并且可以有不同的访问修饰符来控制其可见性,如public
、private
、protected
或default
。
public class User {
private String name; // 私有属性,只能在类内部访问
public int age; // 公开属性,可以从任何地方访问
}
3. 类的方法
方法是类的行为定义,它们描述了对象可以执行的操作。方法由访问修饰符、返回类型、方法名和参数列表组成。
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
4. 构造方法
构造方法是特殊的方法,用于在创建对象时初始化对象的状态。它们的名称与类名相同,并且没有返回类型。
public class Car {
private String model;
private int year;
public Car(String model, int year) {
this.model = model;
this.year = year;
}
}
1.2 方法(Methods):类的行为体现
1. 实例方法
实例方法是定义在类中,与对象实例相关联的方法。它们可以访问类的属性和其他实例方法。
public class Person {
private String firstName;
private String lastName;
public void introduce() {
System.out.println("Hello, my name is " + firstName + " " + lastName);
}
}
2. 静态方法
静态方法是属于类的,而不是类的某个实例。它们可以在没有创建类实例的情况下调用。
public class MathUtils {
public static int max(int a, int b) {
return (a > b) ? a : b;
}
}
3. 抽象方法
抽象方法是没有具体实现的方法,它只有声明而没有方法体。抽象方法通常在抽象类中定义,并要求子类实现。
public abstract class Shape {
public abstract double getArea();
}
1.3 变量(Variables):存储数据的容器
1. 实例变量
实例变量是定义在类中,属于对象的状态信息。每个对象都有自己的一套实例变量副本。
public class Account {
private double balance;
public void deposit(double amount) {
balance += amount;
}
}
2. 类变量
类变量也称为静态变量,它们属于类本身,而不是类的某个实例。类变量在所有对象之间共享。
public class Counter {
private static int count = 0;
public Counter() {
count++;
}
public static int getCount() {
return count;
}
}
3. 局部变量
局部变量是在方法内部定义的变量,它们只在方法被调用的执行过程中存在。
public int multiply(int a, int b) {
int result = a * b;
return result;
}
02 源代码文件
Java作为一种广泛使用的编程语言,其程序结构的规范性对于代码的可读性、可维护性和跨平台兼容性至关重要。命名规则和文件扩展名是Java程序结构中的基础元素,它们确保了代码的组织性和一致性。
2.1 命名规则:Java程序的命名艺术
1. 标识符命名规则
在Java中,标识符是用于命名类、方法、变量等程序元素的名称。Java的标识符命名规则如下:
- 标识符由字母、数字、下划线(_)或美元符号($)组成,但不能以数字开头。
- 标识符是区分大小写的,即
myVariable
和myvariable
是两个不同的标识符。 - 保留字(如
public
、private
、class
等)不能用作标识符。
2. 类命名规则
类名应该清晰、简洁,并能够反映类的作用或特性。以下是一些类命名的最佳实践:
- 使用名词或名词短语。
- 每个单词的首字母大写,即大驼峰命名法(CamelCase),例如
MyClass
。 - 避免使用下划线和美元符号,除非有特殊原因。
3. 方法和变量命名规则
方法和变量的命名应该直观、有意义,以便于理解其功能和用途。以下是一些命名的最佳实践:
- 方法名通常使用动词或动词短语,表示执行的操作,例如
calculateSum
。 - 变量名应该描述其所存储的数据,例如
employeeList
表示一个员工列表。 - 同样使用小驼峰命名法(lowerCamelCase),例如
userName
。
4. 常量命名规则
常量是程序中固定不变的值,它们的命名规则如下:
- 全部字母大写,单词之间使用下划线分隔,例如
MAX_VALUE
。 - 避免使用缩写,除非是广泛认可的缩写,例如
PI
。
2.2 文件扩展名:Java源代码的文件标识
1. Java源文件
Java源代码文件的扩展名是.java
。每个源文件通常包含一个公共类的定义,并且文件名应与公共类名相同。例如,包含MyClass
的文件应命名为MyClass.java
。
2. 类文件
编译Java源代码后,会产生.class
扩展名的字节码文件。这些文件包含了编译后的Java代码,可以由Java虚拟机(JVM)执行。
3. 包文件
Java的包文件通常具有.jar
(Java Archive)扩展名,它们是包含了多个类文件和其他资源的压缩文件。.jar
文件可以作为单个实体被部署和运行,便于程序的分发和安装。
2.4 源码映射文件
在进行代码混淆或优化时,可能会生成.map
或.smap
等源码映射文件,这些文件用于映射混淆后的代码到原始源代码,便于调试。
03 包和访问控制
Java程序结构的设计是软件开发中的关键环节,它直接影响到代码的可读性、可维护性和扩展性。Java通过包(Packages)、访问控制、类和接口的组织来提供强大的结构化编程能力。本文将详细探讨这些概念,帮助开发者构建清晰、高效的Java程序。
3.1 包(Packages):命名空间和模块化
1. 包的定义和作用
包是Java中用于组织类和接口的命名空间。它们提供了一种将类分组的方法,避免了名称冲突,并提供了访问控制。包名通常反映了类的功能和位置,使用反向互联网域名的方式来确保唯一性。
package com.example.myapp;
2. 包的声明
在Java源文件中,包的声明是文件的第一行,使用package
关键字后跟包名。
package com.company.project;
public class MyClass {
// ...
}
3. 包的访问控制
包可以具有不同的访问级别,如公开(public)或私有(private)。默认情况下,如果包没有指定访问级别,则为默认包,其访问级别为包私有。
3.2 访问控制:保护类和成员
1. 访问修饰符
Java提供了四种访问修饰符来控制类、方法和变量的访问级别:
public
:公开访问级别,可以被任何其他类访问。protected
:受保护的访问级别,可以被同一个包内的类和子类访问。default
(无修饰符):默认访问级别,只能被同一个包内的类访问。private
:私有访问级别,只能被声明它的类访问。
2. 访问控制的重要性
访问控制是封装原则的一部分,它帮助隐藏类的内部实现细节,只暴露必要的接口。这提高了代码的安全性和灵活性。
3.3 组织类:构建程序的基石
1. 类的定义
类是Java中定义对象的蓝图。它包含了字段(变量)和方法(函数),以及构造函数用于初始化对象。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
2. 类的组织
类应该根据其功能和职责进行组织。相关功能的类可以放在同一个包中,以便于管理和维护。
3.4 接口(Interfaces):定义契约
1. 接口的定义
接口在Java中是一种完全抽象的类,它只包含未实现的方法声明。接口定义了类必须实现的方法,但不提供实现。
public interface Drivable {
void drive();
}
2. 接口的作用
接口用于定义类之间的契约。它们允许多个不相关的类共享相同的方法签名,而不需要共享实现代码。
3. 实现接口
类可以使用implements
关键字来实现一个或多个接口,并且必须提供所有接口方法的具体实现。
public class Car implements Drivable {
public void drive() {
System.out.println("Car is driving on the road.");
}
}