静态
Java 支持静态方法和静态变量 。
静态方法
当在定义类的时候,类中都会有相应的属性和行为。而属性和行为都是通过创建本类对象调用的。如果创建对象调用方法,发现这个方法中没有使用到对象中的特有数据,那么创建该对象仅仅是为了调用方法,就显得这个对象创建很多余,这时可以使用static关键字修饰这个方法,这个方法被称为静态方法,可以通过类名的方式直接调用。
什么时候使用静态修饰方法?
定义功能时,如果功能不需要访问类中定义的成员变量(非静态)时,该功能就需要静态修饰。
class Dog
{
//Dog的成员属性age和name
private String name;
private int age;
//Dog的构造函数,拥有参数列表
public Dog(int age , String name)
{
//接受到创建对象时传递进来的值,将值赋给成员属性
this.age = age;
this.name = name;
}
Dog的成员方法speak
public void speak()
{
System.out.println("name="+name+",age="+age);
}
public void sleep()
{
System.out.println("睡觉!!!");
}
}
class DogTest
{
public static void main(String[] args)
{
//sleep方法是静态方法,属于类的方法,可以使用类名直接调用
Dog.sleep();
}
}
解析:在Dog类中sleep方法中不需要访问类中定义的成员变量,在测试类DogTest类仅调用这个方法,没有必要创建对象,此时,我们就可以把这个方法加上static变为静态方法,可以直接通过类名调用。
总结:定义静态函数的唯一条件,不直接调用成员!
静态变量
如果若干个同类对象当中存在相同的属性值的话,那么这个属性值就可以被抽取出来定义为静态变量。
静态变量将变量值存储在一个公共的内存地址 。 因为它是公共的地址 ,所以如果某一个对象修改了静态变量的值 , 那么同一个类的所有对象都会受到影响 。
静态一般要比对象的生命周期长。
class Dog
{
//Dog的成员属性age、name和type
String name;
int age;
static String type="哈士奇";
}
class DogTest
{
public static void main(String[] args)
{
Dog d1=new Dog();
Dog d2=new Dog();
Dog d3=new Dog();
d1.type="金毛";
System.out.println(d1.type);
System.out.println(d2.type);
System.out.println(d3.type);
}
}
上面代码中,Dog类中,对于狗来说,它们名字年龄不同,但是它们的种类都属于哈士奇,DogTest类创建对象时,创建三个对象,但它们种类都是一样的,没必要创建三次type,这时我们就可以把种类type用静态变量修饰,让所有对象共享这个属性。当d1将type的值该为金毛,d2和d3的type属性也会被改为金毛。
final关键字
上面代码中,按理来说所有哈士奇的种类不能被改变。不能被改为金毛,加private会不能访问,这时候我们可以再用final关键字修饰这个变量。
final的意思为最终,不可变。final是个修饰符,它可以修饰类,类的成员以及局部变量。final 修饰变量 表示该变量所存储的地址不可改变可以更改地址所对应的数据中的值
- final修饰的变量称为常量,这些变量只能赋值一次,定义的时候必须有初始值
- final修饰的基本数据类型变量,表示其在常量池中的地址不可变,也就是不能改变值。
- final修饰的引用类型变量,表示该引用变量的引用,即地址不能变,而不是引用所指的对象中的数据还是可以变化的
什么时候会在程序中定义final常量?
当程序中一个数据是固定不变的,这时为了增加阅读性,可以给该数据起个名字。为了保证这个变量的值不被修改,加上final修饰,变量就为阅读性很强的常量。
通常规范中:常量名称所有字母大写,若有多个单词组成,单词间使用下划线连接。 public static final修饰的常量称为全局常量;
例如:public static final double PI =3.14159265358979323846;
静态变量和成员变量的区别
1、存储位置
- 静态变量在静态方法区中类所属的空间里
- 成员变量在堆内存中对象的所属空间里
2、生命周期
- 静态变量随着类(.class文件)的加载而存在,随着程序的结束而结束
- 成员变量随着对象的创建而存在,随着对象的消亡而消亡
3、调用方式
- 静态变量可以对象调用、类调用
- 成员变量只能对象调用
4、别名
- 静态变量属于类的,也叫类成员
- 成员变量属于对象的,也叫对象特有