• java===java基础学习(8)---静态域与静态方法


    静态域:
    如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。例如,加入需要给每一个雇员赋予唯一的标识码。这里给的Employee类添加一个实例域id和一个静态域nextId:

    class Employee

    {

      private static int nextId = 1;

      private int id;

    }

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

    下面一个简单的方法:

    public void setId()

    {

      id = nextId;

      nextId++;

    }

    假定为harry设定雇员标识码:

    harry.setId();

    harry的id域被设置为静态域nextId当前的值,并且静态域nextId的值加1:

    harry.id = Employee.nextId;

    Employee.nextId++;

     

    静态常量:

    静态变量使用得比较少,但是静态常量却使用的比较多。例如,在Math类中定义了一个静态常量:

    public class Math

    {

      public static final double PI = 3.1415926535897932384624;

    }

    在程序中,可以采用Math.PI的形式或者这个常量。

    如果关键字static被省略,PI就变成了Math类的实例域。需要通过Math类的对象访问PI,并且每一个Math对象都有他自己的一份PI拷贝。

    #这句话的理解:加了static,不用创建类的对象,就可以直接调用类里面对应的数据。但是static去掉,必修创建类的实例。才能访问

     

    静态方法:

    静态方法是一种不能向对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。表达式:

      Math.pow(x, a)

    不使用任何Math对象。换句话讲,就是没有隐式的参数。

    可以认为静态方法是没有this参数的方法。

    Employee类中的静态方法不能访问Id实例域,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。下面是使用这种静态方法的一个示例:

    public static int getNextId()

    {

      return nextId; //return static field

    }

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


    int n = Employee.getNextId();

    注释:可以使用对象调用静态方法。例如,如果harry是一个 Employee对象,可以用harry. getnextld()代替Employee. getnextld()。不过,这种方式很容易造成混淆,其原因是 getnextld方法计算的结果与 harry毫无关系。我们建议使用类名,而不是对象来调用静态方法。

    下面两种情况下使用静态方法:

    * 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供。例如(Math.pow())

    * 一个方法只需要访问类的静态域(例如:Employee.getNextId)

    main方法:

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

    同理,main方法也是一个静态方法。

    public class Application

    {

      public static void main(String[] args)

      {

       // construct objects here

      ... ...

      }

    }

    main 方法不对任何对象作操作。事实上,在启动程序时候还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象。

    提示: 每一个类可以有一个main方法。这是一个常用于对类进行单元测试的技巧。例如,可以在Employee类中添加一个main方法:

     


    package testbotoo;
    
    
    public class StaticTest {
        
        public static void main(String[] args){        //unit test
    
            Employee[] staff = new Employee[3];
            
            staff[0] = new Employee("tom",123);
            staff[1] = new Employee("jin", 234);
            staff[2] = new Employee("jack", 899);
            
            for(Employee e : staff)
            {
                e.setId();
                System.out.println("name="+e.getName()+",salary="+e.getSalary()+",id="+e.getId());
            }
        }
    }
    
    
    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; //set id to next available id
            nextId++;
        }
        
        public static int getNextId()
        {
            return nextId; //return static field
        }
        
        public static void main(String[] args)
        {
            Employee e = new Employee("Herry", 10);
            System.out.println(e.getName()+" "+e.getSalary());
        }
    }
  • 相关阅读:
    【Q&A】pytorch中的worker如何工作的
    【教程】opencv-python+yolov3实现目标检测
    ubuntu使用scrcpy手机投屏-免费神器scrcpy【介绍、安装、使用】
    【从踩坑到教程】win10下ubuntu18.04双系统UEFI模式安装、Nvidia驱动安装
    Python引用与目录结构
    交流总结
    转载-趣图展现程序员职业生涯的11个阶段
    转载-在家工作,10招助你效率、生活两不误
    转载-新年寄望:从小做起,活在当下
    转载-成为明星程序员的10个提示
  • 原文地址:https://www.cnblogs.com/botoo/p/8716200.html
Copyright © 2020-2023  润新知