静态变量、静态方法
static关键字的含义
关键字:static的含义的是:静态的。
static可以修饰类中的属性和方法,被static修饰的属性我们称之为变量,被static修饰的方法我们称之为类方法。
面向对象的重要特征之一是封装,即各个对象只能访问自己的成员变量和成员方法,若要使某些变量和方法被该类的所有对象共享,则必须定义为静态变量和静态方法。
静态变量
类的变量分为静态变量和实例变量2种,static修饰的是静态变量,没有使用static修饰的是实例变量。
静态变量和实例变量二者的区别:
- 静态变量在内存中只有一个内存空间,在加载类的过程中完成静态变量的内存分配,可以直接通过类名访问。
- 每创建一个新的实例对象,就会为实例变量分配不同的内存,各个对象访问自己的实例变量。
注意:
无论创建了一个类的多个对象,静态变量只初始化一次,所有的实例都可以访问此静态变量,而且可以通过类名直接访问。
示例:
/**
* 使用实例变量实现共同的售票
* */
public class Demo_one {
public static void main(String[] args) {
Saler saler = new Saler();
saler.name="张三";
saler.sale();
Saler saler1 = new Saler();
saler1.name="李四";
saler1.sale();
//开始具体卖票
saler.sale();
saler1.sale();
saler.sale();
saler1.sale();
saler.sale();
saler1.sale();
saler.sale();
}
}
class Saler{
public String name;
public int tickets = 5;
//定义模拟卖票方法
public void sale(){
if(tickets > 0){
System.out.println(name+"售票一张,当前剩余:"+ --tickets);
}
}
}
结果如下图:
可以发现,二个售票员都在单独的卖票,每个人都卖5份,而实际中是二个人共同卖5份。所以如果同一个类的多个对象可以共享这个变量需要设置成静态的。
示例:
class Saler{
public String name;
//只需要在需要共享的变量前加static关键字就可以。
public static int tickets = 5;
//定义模拟卖票方法
public void sale(){
if(tickets > 0){
System.out.println(name+"售票一张,当前剩余:"+ --tickets);
}
}
}
结果如下图
这样就可以正常的卖票了。
静态方法
static修饰的方法叫做静态方法,可以直接使用“类名.方法()”来调用。
语法:
[权限修饰符] static 返回值类型 方法名称(类型 参数1,类型 参数2){
方法体;
}
注意:
static修饰方法时候,该关键字static处于访问权限修饰符的后面,返回值类型的前面。静态方法中只能调用一个类的静态成员(静态属性和静态方法),不能直接调用同一个类的实例成员。
示例:
/**
* 使用静态方法,完成售票
* */
public class Demo_one {
public static void main(String[] args) {
Saler.sale();
Saler.sale();
Saler.sale();
Saler.sale();
Saler.sale();
Saler.sale();
Saler.sale();
}
}
class Saler{
public static int tickets = 5;
//定义模拟卖票方法
public static void sale(){
if(tickets > 0){
System.out.println("售票一张,当前剩余:"+ --tickets);
}
}
}
final修饰变量
修饰变量的时候,表示该变量的值不可改变,成为常量。
语法:
final 数据类型 变量名 = 值;
final的特征
- final修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量、实例常量和局部常量。
- final类型的变量必须显示地初始化,否则将导致编译错误。
- final变量只能被赋值一次。
- 在定义final常量时,一般以大写字母命名,且多个单词之间使用下划线隔开。
- 常量只能赋值一次。
示例:
/**
* 设置一个静态常量,一个普通常量还有一个局部常量
* */
public class Demo_one {
public static void main(String[] args) {
System.out.println("=================");
Saler saler = new Saler();
saler.methodd();
Saler saler1 = new Saler();
saler1.methodd();
Saler saler2 = new Saler();
saler2.methodd();
}
}
class Saler{
final static int age = 21;
final Double num = Math.random();
public void methodd(){
final int total;
total = 2;
System.out.println("局部常量total的值是"+total);
System.out.println("静态常量age的值是"+age);
System.out.println("常量num的值是"+num);
System.out.println("-----------------");
}
}
定义final变量的时候,必须同时为其赋初始值。
包
什么是包
Java中的类似于Windows系统的文件夹。文件夹的作用是可以区分不同目录下的同名文件。
包的命名
包的命名通常是域名反转,全部名称使用小写。
JavaSE类库中的常用包
JDK提供了一些Java的常用包,主要包括3种:
- Java.lang包:包含线程类(Thread)、异常类(Exception)、系统类(System)、整数类(Integer)和字符串类(String)等。通常在编写Java程序时使用。Java.lang包是由Java虚拟机自动引入的包,即使程序没有“import java.*”语句来引入此包,它也会被自动引入。
- Java.io包:输入/输出包,包含各种输入流类和输出流类。例如:文件输入流类(FileInputStream类)、文件输出流类(FileOutputStream类)等。
- Java.util包:提供日期类(Date)、集合类(Collection)等实用类。
除了以上的3种,JDK中还有很多其他的包,例如:用于数据库编程的Java.sql包、用于网络程序的Java。rmi包以及用于编写声音程序的Javax.sound包。