第五章. static,final与Java访问权限
1. Java关键字:static ,final
1.1 final 实例域:
这个域的值被设置,不能够再对它进行修改。
修饰:
- 类
- 方法
- 变量
1.2 final 类和方法
final类:不允许被继承
final方法:不允许被覆写的方法。
public final class Executive extends Manager
{}
public class Employee {
public final String getName()
{ return name;}
}
1.3 静态static
静态域:又叫类域,存放在固定内存地址中,被所有类的对象共享。
修饰:
- 变量
- 方法
- 类(内部类?)
- 匿名方法块
class Employee {
private static int nextld = 1 ;//所有对象共享nextId = 1;
private int id;
}
静态常量:静态变量使用得比较少,但静态常量却使用得比较多。
public class Hath {
public static final double PI = 3.14159265358979323846;
}
静态方法:没有隐式参数,也就是没有this参数的方法,但可以访问自身类中的静态域。只能调用静态变量
public static int getNextld()
{
return nextld;
}
int n = Employee.getNextl();//类名直接调用
- 可以通过类名直接调用静态方法
- 静态方法不能调用非静态方法,非静态方法可以调用静态方法
以下两种情况使用静态方法:
- 方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如: Math.pow)
- 一个方法只需要访问类的静态域(例如:Employee.getNextldh)
1.4 单例模式
- 采用static 来共享对象实例
- 采用private 构造函数,防止外界new操作
1.5 常量池
:相同的值只存储一份,节省内存,共享访问
-
Java为很多基本类型的包装类/字符串都建立常量池
-
Java为常量字符串都建立常量池缓存机制
public class StringConstantTest {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = "ab" + "c"; //都是常量,编译器将优化,下同
String s4 = "a" + "b" + "c";
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //true
System.out.println(s1 == s4); //true
}
}
基本类型的包装类和字符串有两种创建方式
- 常量式(字面量)赋值创建,放在栈内存 (将被常量化)
Integer a = 10;
String b = “abc”; - new对象进行创建,放在堆内存 (不会常量化)
Integer c = new Integer(10);
String d = new String(“abc”);
2. 包与路径(package import)
- Java通过包(package)来存放、分开类
- Java通过 import 来导入类
- 类的完整名字:包名 + 类名
2.1 包
即存放类的文件夹。
- 同一目录下类的引用不需要声明,不同目录下类的引用需要import路径导入,编译时与之链接。
- 使用包能确保类名的唯一性
- 如果包与目录不匹配,虚拟机就找不到类 。
类的导入:
import java.time.*; //导入util的全部类
import java.time.LocalDate; //导入time的特定类
-
只能导入一个目录下的所有类,不能导入一个目录下的所有文件
-
如果两个包中有相同类,则增加一个特定的 import 语句
import java.util.*;
import java.sql.*;
import java.util.Date;
- 如果这两个 Date 类都需要使用,则在每个类名的前面加上完整的包名。
java.util.Date deadline = new java.util.Date();
java.sql.Date today = new java.sql.Date(...);
静态导入:
import 语句不仅可以导人类,还增加了导人静态方法和静态域的功能。
import static java.lang.System.*; //就可以使用 System类的静态方法和静态域,而不必加类名前缀
out.println("Goodbye, World!");
2.2 jar文件的导出和导入
jar文件:一种扩展名为jar的文件,是Java所特有的一种文件格式,用于可执行程序文件的传播。
- jar文件实际上是一组class文件的压缩包
jar文件优势:
- jar文件经过压缩,只有一个文件,在网络下载和传播方面,更具有优势
- 将多个class文件压缩成jar文件(只有一个文件),可以规定给一个版本号,更容易进行版本控制
2.3 classpath
- 包具体位置不重要,通过classpath来指定
3. java访问权限
Java访问权限有4种:
public:公开的,可以被任何类使用
private:私有的,只能被本类使用
protected:同一个包,子类均可访问
default(不写):同一个包类访问
- 使用范围:
- 四种都可以用来修饰成员变量、成员方法、构造函数
- default和public可以修饰类
- 推荐:
- 成员变量都是private
- 成员方法都是public
XXXXXXX | 同一个类 | 同一个包 | 不同包的子类 | 不同包非子类 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default | √ | √ | ||
private | √ |
引用自Mooc华师大的PPT