4.3静态域与静态方法

静态域

如果将域定义为static,每个类中只有一个这样的域,而每个对象对于所有的实例域却都有自己的一份拷贝

class Employee 
{
  private static int nextId = 1;
  private int id;
}

每一个对象都有自己的 id域,但这个类所有的实例域将共享一个nextId域。可以说,如果有1000个Employee类的对象,则有1000个id域,但是静态域nextId只有一个,即使没有雇员,静态域也存在,它属于类,而不属于任何的对象。

  • 静态域被称为类域

静态常量

例如:可以采用Math.PI的形式获得3.14159265358979323846这个常量,另外在System.out使用静态常量比较多
由于灭一个对象都可以对公有域进行修改,所以,最好不要将域设计为public。然而,公有常量(final域)却没有问题。因为out被声明为final,所以,不允许在将其他打印流赋给它:

System.out = new PrintStream(...) ;//Error --out is final

setOut方法时一个本地方法,而不是用java语言实现的。本地方法可以让过java语言存取控制机制

静态方法

静态方法是一种不能向对象实时操作的方法,换句话说就是没有隐式函数
可以 认为静态方法时没有this参数的方法

  • 静态方以访问自身中的静态域
public static int getNextId()
{
  return nextId; //returns static field
}

可以通过类名调用这个方法:

int n = Employee.getNextId();
  • 可以使用对象调用静态方法,但建议使用类名,而不是对象调用静态方法

  • 在下面两种情况下使用静态方法:
    1.一个方法不需要访问对象状态,其所需参数都时通过显示参数提供
    2.一个方法只需要访问类的静态域

  • static: 属于类且不属于类对象的变量和函数

工厂方法

类似LocalDate 和NumberFormat的类使用静态工厂方法来构造对象

  • NumberFormat类不利用构造方法的原因:
    1.无法命名构造器,构造器的名字必须与类的名字相同。
    2.当使用构造器时,无法改变构造器的对象类型

mian 方法

不需要使用对象调用静态方法,例如不需要构造Math类对象就可以调用Math.pow
mian方法是一个静态方法

  • main 方法不对任何对象进行操作,静态的main方法执行并创造程序所需要的对象
public class StaticTest
{
   public static void main(String[] args)
   {
      //用三个Employee对象填充Staff数组
      staff[0] = new Employee("Tom", 40000);
      staff[1] = new Employee("Dick", 60000);
      staff[2] = new Employee("Harry", 65000);

      // 打印所有员工对象的信息
      for (Employee e : staff)
      {
         e.setId();
         System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
               + e.getSalary());
      }

      int n = Employee.getNextId(); // 调用静态方法
      System.out.println("Next available id=" + n);
   }
}

class Employee
{
   private static int nextId = 1;//静态域
   private String name;
   private double salary;
   private int id;

   public Employee(String n, double s)
   {
      name = n;
      salary = s;
      id = 0;
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public int getId()
   {
      return id;
   }

   public void setId()
   {
      id = nextId; //将ID设置为下一个可用ID
      nextId++;
   }

   public static int getNextId()
   {
      return nextId; //返回静态字段
   }

   public static void main(String[] args) //单元测试,静态方法 
   {
      Employee e = new Employee("Harry", 50000);
      System.out.println(e.getName() + " " + e.getSalary());
   }
}

Employee类也有一个静态的main方法用于单元测试

方法参数

  • 程序设计语言中将有关参数传递给方法(函数)的一些专业术语有:
    按值调用表示方法接受的是调用者提供的值
    按引用调用:表示方法接受的是调用者提供的地址,一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值
  • 按。。。调用:是一个标准计算机科学术语,用来描述各种程序设计语言找那个方法参数传递的方式
  • Java程序设计语言总是采用按值调用,方法得到的是所有参数值的一个拷贝,方案分不能修改传递给它的任何参数的内容。一个方法不能改变基本数据类型的参数,方法得到是对象引用的对象,对象引用及其他拷贝同时引用同一个对象。
  • 总结java中方法参数的使用情况:
    一个方法不能修改一个基本数据类型的参数
    一个方法可该表一个对象参数的状态
    一个方法不能让对象参数引用一个新的对象

你可能感兴趣的:(4.3静态域与静态方法)