【JAVA入门】关于static存在的必要性
很多刚刚接触JAVA的人对于static并不是很懂(反正我当初是这样的),不明白他到底有什么用,什么静态非静态,压根不明白其作用和意义。今天本垃圾正好犯关于static的错误,特以此文以表对JAVA的尊重。
这是我暑假项目实训的第一天,前几天无非是对JAVA的一些复习,今天的一个练习就是编写Complex的四则运算。
话不多说,我先贴代码再解释。
package com.funyoo.complex.core;
public class Complex {
private double real;
private double virl;
public Complex() {
this(0.0, 0.0);
}
public Complex(double real, double virl) {
// this.real = real;
// this.virl = virl;
setReal(real);
setVirl(virl);
}
public Complex(double real) {
this(real, 0.0);
}
public Complex(Complex complex) {
this(complex.real, complex.virl);
}
public double getReal() {
return real;
}
public void setReal(double real) {
this.real = real;
}
public double getVirl() {
return virl;
}
public void setVirl(double virl) {
this.virl = virl;
}
// 加法
public Complex add(Complex complex) {
this.real += complex.real;
this.virl += complex.virl;
return this;
}
public static Complex add(Complex c1, Complex c2) {
return new Complex (c1).add(c2);
}
//取反
private static Complex opposite(Complex complex) {
return new Complex(-complex.real, -complex.virl);
}
//减法
public Complex sub(Complex complex) {
return add(this, opposite(complex));
}
public static Complex sub(Complex c1,Complex c2) {
return add(c1,opposite(c2));
}
//乘法
public Complex mul(Complex complex) {
double tmp = this.real * complex.real - this.virl * complex.virl;
this.virl = this.real * complex.virl + this.virl * complex.real;
this.real = tmp;
return this;
}
public static Complex mul(Complex c1, Complex c2) {
return new Complex (c1).mul(c2);
}
//取倒数
private static Complex reciprocal(Complex complex) {
double model = complex.real * complex.real + complex.virl * complex.virl;
if (Math.abs(model) < 1e-6)
throw new ExceptionDivZero("0不能做除数!");
return new Complex(complex.real / model, -complex.virl / model);
}
//除法
public Complex div(Complex complex) {
return mul(this, reciprocal(complex));
}
public static Complex div(Complex c1, Complex c2) {
return mul(c1, reciprocal(c2));
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (! (obj instanceof Complex)){
return false;
}
Complex other = (Complex) obj;
if (Math.abs(this.real - other.real) > 1e-6)
return false;
if (Math.abs(this.virl - other.virl) > 1e-6)
return false;
return true;
}
@Override
public String toString() {
return "(" + real + "," + virl + ")";
}
}
这个直接是最终的代码。
没改之前,我的各个方法都是没加static的,所以在我运用这个类里里面的方法的的时候,必须要先new一个对象,然后借助这个对象来“点”出其方法。即
Complex complex = new Complex();
complex.方法名
但是如果这些方法是static修饰的,就可以不用new,直接用类名称加“点”调用其某个方法。
即Complex.方法名
有人会问,这有什么区别呢?无非是多new了一次而已。
切记,这只是一个小练习,如果遇到的是一个项目,庞大且复杂。你每一次想使用某类的一个方法就要每new一次,就要把这个类所有的方法都“拿”出来,这样大大浪费了空间,而且每次如此复杂,语意性极差。
所以,static的意义:
方便以后编程,可以直接用类名称调用方法;
节省了每次调用所需new对象的空间,做到“用后即抛”;
增强语意性,精简代码。