Java基础:Static关键字的使用

Static关键字

一.概念

static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,通常将用static修饰成员称为类成员或者静态成员。

1.static变量

static变量也称作静态变量,静态变量和非静态变量的区别:静态常量在内存中,当且仅当类初次加载时会被初始化。而非静态变量,在创建对象的时候被初始化。

注意1:初始化的时机不同,一个是在类加载过程初始化,一个是在创建对象的时候。

注意2:非静态方法中不能定义静态常量

个人理解:非静态方法在创建对象后,在栈中被调用,静态常量在类加载时被调用。

2.static方法

在static修饰的方法内部不能调用非静态方法,非静态方法内部可以调用静态方法。而且可以在没有创建任何对象前提下,仅仅通过类本身来调用static方法。

理解:在没有创建对象的情况下,使用类去调用方法/变量。静态常量和静态方法不依赖对象,依赖类。非静态常量和非静态方法依赖对象,所以静态方法中不能调用非静态方法和非静态常量,非静态常量和非静态方法可以调用静态常量和静态方法。

注意:我们常见的main方法就是static方法。所以我们没有创建main对象,就可以直接调用mian方法。

3.静态块

stati用来修饰静态代码块以优化程序性能。static可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次

public class Number {
private int i;
public Number(int i){
	this.i=i;
}
/*
 * 判断数值大小的方法,每次调用这个方法都要新建m,n两个数值。
 */
public void isBornBoomer(){
int m = 5;
int n =10;
if(i>5 & i<10){
	System.out.println("该数大于5小于10");
}
}
public static void main(String[] args) {
	Number p =new Number(8);
	p.isBornBoomer();
}
}
用静态块优化:
public class StaticNum {
	private int i;
	private static int m;
	private static int n;
	/*
	 * 使用一次,只在类加载的过程加载一次即可,为了JVM。
	 */
static{
  m=5;
  n=10;
}
public StaticNum(int i){
	this.i=i;
}
public void BooleanNumber(int i){
	if(i>StaticNum.m & StaticNum.n<10){
		System.out.println("静态块的使用");
	}
}
	public static void main(String[] args) {
		
	}
}
使用静态块的用途:有些经常使用的变量,避免反复使用占用内存,使用静态块一次加载直到程序结束,只执行一次。

4.面试题

public class Test {
public int aMethod() {
static int i = 0;
i++;
return i;
}
public static void main (String args[]) {
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}

输出结果是什么?D

A.0

B.1

C.2

D.编译失败

解析:在aMehtod这个非静态方法中定义了静态常量,是编译错误。

下列哪种说法是正确的(D)

A 实例方法可直接调用超类的实例方法

B 实例方法可以直接调用超类的类方法

C 实例方法可直接调用其他类的实例方法

D实例方法可直接调用本类的类方法

解析:

实例方法:没有被static修饰的方法;

类方法:被static修饰的方法

A实例方法中无法直接调用父类的实例方法,需要创建父类的对象进行调用。

B父类中的类方法如果是private修饰的就无法被子类的实例方法调用。static修饰的方法和变量无法修改访问权限,被private修饰的方法常量,依旧是私有的。

C实例方法中无法直接调用父类的实例方法,需要创建父类的对象进行调用。

D可以。

本题考的是:

1.实例方法依赖对象,类方法依赖于类;

2.static修饰的方法,不会修改private public 等权限。被private修饰的,依然只有本类可以使用。

猜你喜欢

转载自blog.csdn.net/Muyu_Z/article/details/79992454