Java 面向对象之static关键字

版权声明:欢迎交流,转载请注明出处。 https://blog.csdn.net/u013034226/article/details/45250741

我们知道,创建对象就是为了产生实例,并进行数据的封装;而调用功能时,却没有用到这些对象中封装的数据,那该对象的创建还有意义吗?(虽然可以编译运行,但是在堆内存中空间比较浪费)。

解决办法就是:不建议创建对象,Java中是通过使用static关键字,这是一个成员修饰符,被静态static修饰的方法除了可以被对象调用外,还可以被类名调用。

静态方法:

举个例子:

class Person
{
	private String name;
	private int age;

	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public void speak()
	{
		System.out.println("name="+this.name+",age="+this.age);
		sleep();
	}

	//定义一个睡觉功能。
	public static void sleep()
	{
		System.out.println("睡觉zzzZZZZ");
	}
}

class PersonDemo 
{
	public static void main(String[] args) 
	{
		//Person p = new Person("lisi",20);
		//p.speak();
		//p.sleep();
		Person.sleep();
		}
}

所以,静态看上去很美,是不是所有的方法都静态呢?不行!定义功能时,如果功能不需要访问类中定义的成员变量(非静态)时,该功能需要静态修饰。

静态方法特点:

1,静态方法不能访问非静态成员,但是非静态可以访问静态成员。

说明:静态的弊端在于访问出现局限性,好处是可以被类名调用。

2,静态方法中不允许出现this,super关键字。

(为什么?)→原理:

1,静态是随着类的加载就加载了,也是随着类的消失而消失了。

2,静态优先于对象存在,被对象共享。

3,因为静态先存在于内存中无法访问后来的对象中的数据,所以静态无法访问非静态。

而且内部无法书写this,因为这时对象有可能不存在,this没有任何指向。


静态变量:

什么时候定义静态变量呢?
当该成员变量的值,每一个对象都一致时,就对该成员变量进行静态修饰。

举例(圆的面积):

class Circle
{
	private double radius;//圆的半径。
	private static double pi = 3.14;//每一个圆对象中都存储一份,有点浪费内存空间。实现对象的共享。加入静态关键字修饰。
	Circle(double radius)
	{
		this.radius = radius;
	}
	//获取圆的面积。
	double getArea()
	{
		return radius*radius*pi;
	}
	static void show()
	{
		System.out.println("circle show run.."+pi);
	}
}
class CircleDemo 
{
	public static void main(String[] args) 
	{
		Circle c = new Circle(3);
		
	}
}

静态变量和成员变量的区别:

1,所属范围不同。
静态变量所属于类,成员变量所属对象。
静态变量也称为:类变量;成员变量也称为实例变量。

2,调用不同。
静态变量可以被对象和类调用(一般都用类名调用)
成员变量只能被对象调用。

3,加载时期不同。
静态变量随着类的加载而加载。
成员变量随着对象的加载而加载。

4,内存存储区域不同。
静态变量存储在方法区中。
成员变量存储在堆内存中。

文章有不足之处,多多指出,共同进步。

猜你喜欢

转载自blog.csdn.net/u013034226/article/details/45250741