前言
Java静态对象和非静态对象有什么区别?
静态变量(static variable)
定义
用关键字static声明的变量为静态变量。
解析
实例变量与静态变量
- 实例变量(无关键字static)必须要在实例创建之后才能使用,它们通过引用变量来调用的。
调用程序例如下
Circle circle = new Circle();
circle.values //values修饰符不能为private
- 静态方法可以通过引用变量或者他们类名来调用(不一定要通过实例),静态变量在类中的所有对象所共享。
注意:在一些情况下(前置关键字protected,public,采用默认)Java支持无须创建类的实例就可以调用静态变量。
附上各个域使用的范围
调用程序例如下
Circle.PI;
内存区域
例Circle类的数据域radius是一个实例变量,实例变量是绑定到类的某个特定实例(对象),它是不能被同一个类的不同对象所共享的(不在同一片内存区域)。通俗来说,苹果派配方(class)给予你生产,其中糖的重量(实例变量)每一个人生产出来是很有可能不一样的!再比如,假设百事和可口可乐的所用的材料配方(class)是一样的,关键就在于材料的比例(实例变量)!但是它们的比例是不能共享的(不是同一家公司)!
Circle类代码:
/**
* Created by MadJieJie on 2017/1/7.
*/
public class Circle
{
/**Data area*/
private static double PI = 3.14;
private double radius = 0.0D;
public Circle()
{
}
public Circle(double radius)
{
this.radius = radius;
}
}
假设创建了如下代码
Circle circle1 = new Circle();
Circle circle2 = new Circle(5);
前者circle1的radius和后者circle2的radius是不相关的,它们存储在不相同的内存位置中。它们任何一个radius变化都不会影响彼此。
什么时候需要静态变量
而想让一个类所有实例共享数据,就需要静态变量(static variable),也称类变量(class variable)。静态变量将变量值存储在一个类公共的内存地址中。因为是公共地址,所以当某个对象对静态变量进行修改后,所有的该类对象都会受到影响。
静态常量
定义
用关键字static和final声明的为静态常量。
我常常将那些不会改变的量声明为静态常量用于声明那些不会改变的量。
注意:在一些情况下(前置关键字protected,public,采用默认)Java支持无须创建类的实例就可以调用静态变量。
调用程序例如下
Math.PI;
静态方法
定义
用关键字static 声明的方法为静态方法。
解析
实例方法与静态方法
实例方法(无关键字static)必须要在实例创建之后才能使用,它们通过引用变量来调用的。
静态方法可以通过引用变量或者他们类名来调用(不一定要通过实例),静态方法不能访问类中的实例成员(不同的内存域)。
调用程序例如下
/**
- Created by MadJieJie on 2017/1/7.
*/
public class Circle
{
/**Data area*/
private static double PI = 3.14;
private double radius = 0.0D;
public Circle()
{
}
public Circle(double radius)
{
this.radius = radius;
}
public setRadius(double radius) //Non-static's method
{
this.radius = radius;
}
public static double getPIValues()//static method
{
return PI;
}
protected static void main(String[] args)
{
Circle circle = new Circle(); //notice
//Non-static
circle.setRadius(5.0D);
//static
Circle.getPIValues();
circle.getPIValues();
}
}
内存区域
与静态变量同理,这里就不贴了。
可访问域
- 实例方法可以调用实例方法和静态方法,以及访问实例数据和静态数据。
- 静态方法可以调用静态方法,以及访问静态数据。
什么时候需要静态方法
- 当你在写一个类时,不希望方法被改变或覆盖;
- 当方法不需要实例的值时;
- 没有任何操作需要实例化,大大减少多次实例的内存占用;
- 如果该方法需要是每个实例都需要,即复用性高。