静态域与静态方法

还是很基础的东西,只是做点积累。
显示世界没有最好的东西,只有最合适的东西,做一个小企业的OA系统,用上各种云组建,看起来高大上,其实是过度开发。所以,简单的东西也有用。业务量决定技术。

静态域

static
java 有两个神奇的关键字,final和static,因为每天都在用,肌肉记忆,习惯导致没想过为什么那么使用。
域定义为static,每个对象对于所有的实例域却都是自己的一份copy。
什么意思?
静态域属于class模板,所有创建的对象都有这个属性的copy。

package com.wht.demo;

import java.util.Calendar;
import java.util.Date;

/**
 * 员工类
 *
 * @author wht
 */
public class Employee {
  private int id;
  private static int count;
  private Date hirDay;
  private String name;
  private double salary;

  public Employee(String name, double salary, int year, int month, int day) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month, day);
    this.name = name;
    this.salary = salary;
    this.hirDay = calendar.getTime();
  }

  public Date getHirDay() {
    return hirDay;
  }

  public String getName() {
    return name;
  }


  public double getSalary() {
    return salary;
  }

  public void raiseSalary(double percent) {
    this.salary += this.salary * percent / 100;

  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
    count++;
  }

  public static int getCount() {
    return count;
  }

  public static void setCount(int count) {
    Employee.count = count;
  }
}

package com.wht.demo;

import java.text.SimpleDateFormat;

public class EmployeeTest {

  public static void main(String[] args) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    // 构造三个真实员工
    Employee[] staff = new Employee[3];
    staff[0] = new Employee("孙悟空", 25000.00, 2019, 10, 22);
    staff[1] = new Employee("提莫队长", 25000.00, 2019, 10, 22);
    staff[2] = new Employee("德玛西亚", 25000.00, 2019, 10, 22);

    //业绩不错为每个员工加薪
    int i=0;
    for (Employee emp : staff) {
      emp.raiseSalary(5);
      emp.setId(i++);
    }

    //查看每个员工加薪后的信息
    for (Employee emp : staff) {
      System.out.println(emp.getId());
      System.out.println(Employee.getCount());
      System.out.println("============================");
    }
  }


}

count这个static域,对象既不能不能使用其属性,也不能使用其存取器,并且在类方法中也不能用this(是隐式参数,值得对象本身)。
只有Class本身可以使用其存取器,因为是私有的,所以class也不能直接使用count这个实例域。

从运行结果看,无论多少个对象调用这个值都是一样的。其实没必要记住什么copy,只记住这个是模板公共属性,无论多少个对象使用,都是取自一个值即可。

静态常量

静态变量使用的比较少,但静态常量却使用的比较多。
在真实项目中,静态常量作为系统参数都是为了系统通用而其它定义好。
经常会创建一个常量类,所有属性都是静态常量,并且把构造方法设置为私有。
静态常量因为你不能修改,所以也不需要任何存取器,访问权限public,如果设置为private也没什么意义了,只有自己可以用。

package com.wht.demo;

public  class Constans {
  private Constans() {
  }
  
  public static final String ENV="PRO";

  public static void main(String[] args) {
    Constans.ENV="SIT";
    System.out.println(Constans.ENV);
  }


}

如上如果给常量赋值会直接报错。
一般项目开发规范,静态常量全部用大写。

静态方法

静态方法是一种不能向对象实施操作的方法。
也就是第一参数,隐藏参数为class,不为任何具体对象。
Math 类中的方法都是静态方法,就是数学函数的集合,而不需要Math构建对象去调用。
简单点,静态方法就是没有this参数的方法。

实例域都是属于对象的属性,所有静态方法不能使用实例域,除非实例域是静态域,因为静态域是属于class本身的。

    //查看每个员工加薪后的信息
    for (Employee emp : staff) {
      System.out.println(emp.getCount());
      System.out.println(Employee.getCount());
    }

从上面看到打脸的实事来了,静态域只有class直接使用,但是静态方法对象和class都可以调用。
真实开发过程中,静态属性和方法,一般都是用class直接使用,以免混淆。

什么情况下使用静态方法:

  1. 一个方法不需要访问对象状态,其它所需要的参数都是通过显示参数提供。
  2. 一个方法只需要访问类的 静态域。

Factory方法

针对大多数程序员,都是做业务开发,基本用不到这种方法,但是对于真正技术人员却是非常重要的方法。
因为框架离不开工厂模式,自动化构建离不开factory。

  public static void main(String[] args) {
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
    NumberFormat percentFormatter = NumberFormat.getPercentInstance();
    double x =0.1;
    System.out.println(currencyFormatter.format(x));
    System.out.println(percentFormatter.format(x));
  }

为什么不用构造器。

  1. 无法命名构造器,构造器必须与类名同名,但是我们希望得到见文知意的对象。
  2. 当使用构造器时,无法改变多有构造的对象类型。

main方法

main方法不对任何对象进行操作。事实上,在启动程序时还没有任何一个对象。
静态的main方法将执行并创建程序所需要的对象。
main往往用于程序启动,但是一个应用程序可以有多个main方法,除了作为启动入口,其它main方法多用于调试,正式发布习惯注释掉无用的main方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值