一、前言
今天还是面向对象相关知识点的分享,包是写小型项目时不可或缺的存在,final关键字用的地方不算太多。idea会提示我们导包,有时会自动导包,确实十分方便。但是我们也不能不会自己去导包。
面向对象篇不出意外的话本周就要结束了。希望大家多多支持。
二、包
在Java中,包(Package)是一种组织和管理类及其他资源的机制。
1. 组织类和资源
包提供了一种层次化的结构,用于组织Java类和其他资源文件。通过包,可以将相关联的类和接口组织在一起,形成一个逻辑上的单元。
2. 命名空间管理
包在Java中还用于管理命名空间(Namespace)。每个包中的类都具有唯一的全限定名(Fully Qualified Name),这包括包名和类名。这种命名空间的分隔避免了不同包中类名冲突的问题。
3. 访问控制
Java中的包也与访问控制密切相关。类可以通过public
、protected
、private
和默认访问(不使用关键字修饰)来定义其可见性。包访问权限(default)指的是同一个包中的其他类可以访问该类的包级私有成员。
4. 包路径
包在文件系统中以文件夹的形式存在。例如,包com.example.util
通常对应于文件系统中的路径com/example/util/
。这种结构使得Java编译器和虚拟机可以找到并加载正确的类文件。
5. 包的声明
在Java源文件的开头,通过package
语句来声明类所属的包。例如:
package com.example.util;
public class StringUtil {
// 类定义
}
6. 导入其他包
Java中使用import
语句来导入其他包中的类,以便在当前文件中使用这些类而不必使用其全限定名。例如:
package com.example.app;
import com.example.util.StringUtil;
public class MyApp {
public static void main(String[] args) {
String message = "Hello, World!";
String reversed = StringUtil.reverse(message);
System.out.println(reversed);
}
}
7. 标准库和第三方库
Java标准库(Java Standard Library)和第三方库通常也通过包的形式来组织。这使得开发人员可以轻松地使用和管理大量的类和资源。
注:使用其他类的规则
- 使用同一个包中的类时,不需要导包。
- 使用java.lang包中的类时,不需要导包。(例如:String)
- 其他情况都需要导包
- 如果同时使用两个包中的同名类,需要用全类名
示例:
使用其他包中的类,千万别忘了导包!!!
三、final
在Java中,final
关键字可以用来修饰类、方法和变量,具有不同的作用和语义,final
关键字在Java中用于限制类、方法和变量的修改或继承,是Java语言中的重要保护和优化机制之一。
1. final 修饰类
当用 final
修饰一个类时,表示这个类是最终类,即不能被继承。这样的类不能有子类。示例:
final class FinalClass {
// 类定义
}
2. final 修饰方法
当用 final
修饰一个方法时,表示这个方法是最终方法,不能被子类重写(override)。这在设计模式中有时用于确保方法的实现不被修改或覆盖。示例:
class Parent {
public final void finalMethod() {
// 方法定义
}
}
class Child extends Parent {
// 编译错误:finalMethod() 在 Parent 中已经是 final,不能被重写
}
3. final 修饰变量
在Java中,final
可以修饰变量,有以下几种情况:
-
修饰成员变量(字段):如果用
final
修饰一个成员变量,表示这个变量是一个常量,只能被赋值一次。如果是基本数据类型,一旦被赋值后就不能再改变其值;如果是引用类型,则表示该引用不能再指向另一个对象,但对象本身是可以修改的。示例:class MyClass { final int constantVar = 10; // 常量成员变量 public void changeVar() { // 编译错误:不能修改 final 变量的值 constantVar = 20; } }
-
修饰局部变量:在方法或者代码块内部使用
final
修饰局部变量,表示该变量只能赋值一次。这在多线程环境或者匿名内部类中比较有用。示例:public void method() { final int localVar = 100; // 常量局部变量 // 编译错误:不能再次赋值 localVar = 200; }
其他注意事项:
-
final
修饰的类不能被继承,这种类的设计主要用于安全或性能考虑,避免被修改或者继承后破坏其设计。 -
final
修饰的方法不能被重写,这可以确保方法的行为在子类中不会被修改。 -
final
修饰的变量在赋值后不能再次修改其值,确保其值的不可变性。
示例:
类
方法
变量
四、常量
在Java中,常量指的是在程序运行期间值不会发生改变的变量。常量是程序中一种重要的编程元素,它们提供了一种稳定的、不可变的值,有助于代码的健壮性和可维护性。
使用 final
关键字
通过 final
关键字可以定义常量,可以是类常量(静态常量)或实例常量(成员变量)。final
常量必须在声明时进行初始化,并且不能再次赋值。示例:
-
类常量示例:
public class Constants { public static final int MAX_SIZE = 100; public static final String APP_NAME = "MyApp"; }
在其他类中可以直接通过
Constants.MAX_SIZE
和Constants.APP_NAME
来访问这些常量。 -
实例常量示例:
public class MyClass { public final int MAX_CONNECTIONS = 10; public final String DEFAULT_NAME = "John Doe"; }
这些实例常量在每个实例化的对象中都有自己的副本,但值是不可变的。
2. 使用 static final
定义常量
在类级别定义常量时,通常使用 static final
关键字组合。这种方式定义的常量在整个类的生命周期内只有一个副本,所有实例共享。示例:
public class Config {
public static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydatabase";
public static final int MAX_THREADS = 50;
}
这样定义的常量可以通过 Config.DATABASE_URL
和 Config.MAX_THREADS
访问。
3. 枚举类型
Java中的枚举类型也可以用来定义常量,每个枚举常量都是一个实例对象,它们是不可修改的。示例:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
在代码中使用枚举常量时,例如 Day.MONDAY
,它表示一个固定的、不可变的值。
4. 字面值常量
Java中的字面值常量指的是直接写在代码中的数值或字符串,它们在编译时就已经确定了其值,不会发生改变。例如:
int num = 42; // 42 是一个字面值常量
String name = "Alice"; // "Alice" 是一个字面值常量
这些常量的值在程序运行期间是不可修改的。
使用常量的好处:
-
代码可读性和维护性:通过命名常量,可以提高代码的可读性和可维护性,减少了魔法数值或字符串的使用。
-
安全性和稳定性:常量一旦定义后不能被修改,可以在一定程度上保证程序的安全性和稳定性。
注:记录的地址值不能发生改变,内部属性可以改变。