【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对象的空间,做到“用后即抛”;

      增强语意性,精简代码。

全部评论

相关推荐

10-21 23:48
蚌埠坦克学院
csgq:可能没hc了 昨天一面完秒挂
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务