美文网首页
4.3静态域与静态方法

4.3静态域与静态方法

作者: 十六只猴子王 | 来源:发表于2019-03-14 16:27 被阅读0次

    静态域

    如果将域定义为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静态域与静态方法

          本文链接:https://www.haomeiwen.com/subject/emexmqtx.html