还是很基础的东西,只是做点积累。
显示世界没有最好的东西,只有最合适的东西,做一个小企业的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直接使用,以免混淆。
什么情况下使用静态方法:
- 一个方法不需要访问对象状态,其它所需要的参数都是通过显示参数提供。
- 一个方法只需要访问类的 静态域。
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));
}
为什么不用构造器。
- 无法命名构造器,构造器必须与类名同名,但是我们希望得到见文知意的对象。
- 当使用构造器时,无法改变多有构造的对象类型。
main方法
main方法不对任何对象进行操作。事实上,在启动程序时还没有任何一个对象。
静态的main方法将执行并创建程序所需要的对象。
main往往用于程序启动,但是一个应用程序可以有多个main方法,除了作为启动入口,其它main方法多用于调试,正式发布习惯注释掉无用的main方法。