Java的包、final
关键字以及代码块
一、包
包的作用 :
包就是文件夹,用来管理各种不同功能的Java类
包名的书写规则:
公司域名反写 + 包的作用,需要全部英文小写,见名知意
什么是全类名:
包名 + 类名
使用其他类的规则:
- 使用同一个包中的类时,不需要导包(
import
+ 包名) - 使用
java.lang
包(java
的核心包)中的类时,不需要导包 - 其他情况都需要导包
- 如果同时使用两个包中的同名类,需要用全类名
二、final
关键字
final
关键字在 Java 中具有多种用途,具体来说:
final
修饰方法:最终方法,不能被重写final
修饰类:最终类,不能被继承final
修饰变量:是常量,不能被修改- 基本数据类型:变量的值不能修改
- 引用数据类型:地址值不能修改,内部的属性值可以修改
1.修饰变量:
- 当一个变量被声明为
final
,它的值一旦被赋值后就不能再更改。对于基本数据类型,这意味着它的值不可变;对于引用数据类型,它的引用不可变,但可以修改引用的对象的内容。
public class test {private final static int P = 5;// 相当于c语言中的宏定义public static void main(String[] args) {// 基本数据类型:变量的值不能修改final double PI = 3.145926;// PI = 3.14; 报错,final修饰则无法更改// 引用数据类型:地址值不能修改,内部的属性值可以修改final int[] arr = {1, 3, 6, 4, 9, 10};arr[2] = 100;arr[4] = 200;for (int i : arr) {System.out.println(i);}final Student s = new Student("小明", 20);System.out.println(s.getName() + ", " + s.getAge());s.setName("王五");System.out.println(s.getName() + ", " + s.getAge());}
}
2.修饰方法:
- 被
final
修饰的方法不能被子类重写。这样可以保护方法的实现,确保其行为不会被改变。
class Base {final void show() {System.out.println("Final method in Base");}
}class Derived extends Base {// void show() { // 编译错误,不能重写 final 方法// System.out.println("Trying to override");// }
}
3.修饰类:
- 被
final
修饰的类不能被继承。这确保了类的实现不被改变,适用于某些设计模式或需要严格控制类的场合。
final class FinalClass {// 类的实现
}// class AnotherClass extends FinalClass { // 编译错误,不能继承 final 类
// }
final
修饰出的常量:
在实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
常量的命名规范:
- 单个单词:全部大写
- 多个单词:全部大写,单词之间用下划线隔开
细节:
final
修饰的变量是基本数据类型:那么变量存储的数据值不能发生改变final
修饰的变量是引用数据类型:那么变量存储的地址值不能发生改变,对象内部的可以改变
三、代码块
- 局部代码块
- 构造代码块
- 静态代码块
局部代码块:
写在方法里面的代码块,提前结束变量的生命周期,且局部代码块里面的变量也就只能在局部代码块里面使用(用于节约内存,目前不怎么使用)
public static void main(String[] args) {{int a = 10;System.out.println(a);}// System.out.println(a); 会报错
}
构造代码块:
是在一个类中写在成员位置的代码块,当要创建本类对象时,它则会 优先于构造方法执行,因此可以把多个构造方法重复的代码写在构造代码块中
public class Student {private String name;private int age;// 构造代码块:// 1.写在成员位置的代码块// 2.作用:可以把多个构造方法中重复的代码抽取出来// 3.执行时间:我们再创建本类对象时会先执行构造代码块再执行构造方法{System.out.println("准备创建类了");}public Student() {System.out.println("空参构造");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("全参构造");}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;}
}class Test {public static void main(String[] args) {// 创建对象Student s = new Student();Student s2 = new Student("张三", 20);}
}
输出为结果:
目前构造代码块也不怎么使用了,面对构造方法中重复的代码则可以用以下两个方法取代它:
- 使用
this
关键字
public class Student {private String name;private int age;public Student() {this(null, 0);System.out.println("空参构造");}public Student(String name, int age) {System.out.println("开始创建对象了");this.name = name;this.age = age;System.out.println("全参构造");}
}
- 调用外部的方法
public class Student {private String name;private int age;public Student() {调用方法();System.out.println("空参构造");}public Student(String name, int age) {调用方法();this.name = name;this.age = age;System.out.println("全参构造");}
}
静态代码块:
格式:static{}
特点:需要通过 static
关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用(例:在一个平台登录时刚开始只执行一次登录或注册操作,之后的一些功能可以重复出现)
定义与执行时机:
- 静态代码块在类被加载到 JVM 时执行,并且只会执行一次。它在所有的构造函数和实例初始化块之前运行。
示例:
class Example {static {// 静态代码块System.out.println("Static block executed.");}public Example() {System.out.println("Constructor executed.");}public static void main(String[] args) {new Example();new Example();}
}
在这个例子中,静态代码块会在 main
方法之前执行,只会输出一次 “Static block executed.”,而构造函数会在每次创建对象时执行。
用途:
- 初始化静态变量:可以用来初始化类的静态变量。
- 执行一些逻辑:可以用来执行一些需要在类加载时运行的逻辑,比如读取配置文件、注册驱动等。
可以有多个静态代码块:
- 如果类中有多个静态代码块,它们的执行顺序是从上到下的。
class Example {static {System.out.println("First static block.");}static {System.out.println("Second static block.");}public static void main(String[] args) {// 输出顺序将是:// First static block.// Second static block.}
}
与实例代码块的区别:
- 实例代码块在创建对象时执行,每次创建对象都会执行,而静态代码块只在类加载时执行一次。