【JAVA入门】Day11 - 包和final
什么是包?
一、什么是包
包就是文件夹。用来管理各种不同功能的 Java 类,方便后期代码维护。
- 包命名的规则:公司域名反写 + 包的作用,需要全部英文小写,见名知意。如:com.std.domain。
package com.std.domain;
public class Student {
私有化成员变量
构造方法
成员方法
}
一个类真正的名字其实是它的包名+类名,即全类名,又叫全限定名,上面的代码中,学生类的全类名叫:com.std.domain.Student 。一个使用到其他类的测试类,最为完整的写法应该如下所示:
public class Test {
public static void main(String[] args) {
com.std.domain.Student s = new com.std.domain.Student();
}
}
为了简化代码,不让它这么繁琐,Java 引入了 import 关键字,可以将其他包里的类导入到当前文件下。
import com.std.domain.Student;
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
只有导包,才能使用其他包里的类。在 Java 中,导包需要注意以下几点:
- 使用同一个包中的类时,不需要导包。
- 使用 java.lang 包中的类时,不需要导包。
- 其他情况都需要导包。
- 如果同时使用两个包中的同名类,需要用全类名。
import com.std.domain1.Teacher;
//import com.std.domain2.Teacher; 报错
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
com.std.domain2.Teacher t2 = new com.std.domain2.Teacher();
}
}
上面的代码中,我们导入了 domain1包里的 Teacher 类,那么当前文档中的 Teacher 就代表了 domain1 包中的 Teacher。假如 domain2 包中也有一个 Teacher 类,我们想要使用它,那么这里就只能使用它的全类名进行调用(因为通过导包导入的类,是不能重名的,Java 分不清这两个类)。
二、final
final 意为最终的,引申为“不可改变的”。
final 关键字可以用来修饰方法、类和变量。
- 如果用 final 修饰方法,表示这个方法为最终方法,不能被重写。
- 如果用 final 修饰类,表明该类是最终类,不能被继承。
- 如果用 final 修饰变量,那么这个变量就叫做常量,它只能被赋值一次。
//用final修饰父类的show方法,子类的show方法不能重写它。
class Fu {
public final void show() {
System.out.println("父类的show方法");
}
}
//用final修饰的父类,无法被继承,没有子类。
final class Fu {
public void show() {
System.out.println("父类的show方法");
}
}
//用final修饰的变量,变为了常量,只能赋值一次,且必须在初始化过后才能打印。
final int a = 10;
System.out.println(a);
三、常量
在实际开发中,常量一般用作系统的配置信息,方便维护,提高可读性。
常量的命名规范有:
- 单个单词:全部大写
- 多个单词:全部大写,单词之间用下划线隔开
final 修饰变量时:
- 如果 final 修饰的变量是基本类型,那么变量存储的数据值不能发生改变。
- 如果 final 修饰的变量是引用类型,那么变量存储的地址值不能发生改变,但对象内部的属性值可以发生变化。
public class Changliang {
public static void main(String[] args) {
final double PI = 3.14; //基本类型,数据值不能改变
final Student S = new Student(23, "zhangsan");
S.setName("赵六");
System.out.println(S.getName() + ", " + S.getAge());
//S = new Student(); //报错,S存储的地址值不能改变
//数组也是引用类型
final int[] ARR = {1,2,3,4,5};
ARR[0] = 10; //数组内部的属性值可以改变
//ARR = new int[10]; //数组的地址值不能改变
}
}
PS:在获知了 final 的作用以后,字符串不可改变的本质也得以被窥探。String 类本身实际上是以一个 private final 修饰的 value[ ] 数组修饰的,每一个字符的编码值被数组所存储,由于这个 value[ ] 本身是 final 修饰,因此其地址值不能改变,所有的字符串直接赋值实际上是新建了一个字符串;而由于这个 value[ ] 又被 private 修饰,String 类内部又没有对其操作的公有方法,因此 value[ ] 内部的值也无法被直接改变。