static的常见问题和使用误区
学完static关键字的朋友,可能会产生很多疑问,所以本节主要讲解学习Java中关于static常见的几个问题。
1.为什么要用“static”关键字?
通常的来说,用new创建类的实例时,数据的存储空间才会被分配,方法才可供外界调用。有时候我们只想为特定域分配单一存储空间,不考虑要创建多少对象或者说根本就不用创建任何对象,有时候我们想在没有创建对象的情况下也调用方法。在这两种情况下,static关键字,满足了我们的需求。
2.“static”关键字是什么意思?Java中子类是否可以重写父类的static方法?
“static”关键字,“静态”的意思,表明一个成员变量或者是成员方法可以在没有所属类的实例的情况下被访问。
Java中的static方法不能被重写,因为方法重写是基于运行时动态绑定的,而static方法时编译时静态绑定的。static方法跟类的任何实例都不相关。问static方法能否被重写,就相当于在问北京和上海的距离每天如何变化一样。 所以从概念上来说,“重写”与“static方法”是不适用的。
3.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有创建出来,还没有跟任何实例关联上。
4.static静态方法能不能引用非静态资源?
static方法不能直接引用本类中的非静态资源,因为本类中的非静态资源是new的时候才会产生的东西,对于初始化后就存在的静态资源来说,不能引用它。
但是,static方法可以通过传入一个引用类型参数的方式,间接地通过该引用类型的参数来访问该类(引用类型参数的类)中的非静态方法。
5.static静态方法里面能不能引用静态资源?
可以,因为静态资源都是类初始化时加载的。
6.非静态方法中能不能引用静态资源?
可以,非静态方法就是实例方法,那是在new之后才产生的,那么属于类的内容(被static修饰的字段)它都认识。
使用误区
1.static关键字会改变类中成员的访问权限吗?
有过C/C++编程经验的朋友在学Java时,会将Java中的static与C/C++关键字的功能混淆了。在这里只需要记住一点,与C/C++中的static不同,Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private,public,protected,friendly这几个关键字。看下面例子就明白了:
定义一个Student类:
public class Student {
public static String name = "张三";
private static int age = 10;
}
定义Main类调用Student类的静态属性,代码如下:
public class Main {
public static void main(String[] args) {
System.out.println(Student.name);
System.out.println(Student.age);
}
}
代码第4行会提示错误“ The field Student.age is not visible ”,意思为Student.age不可见,这说明static关键字并不会改变变量和方法的访问权限。
2.能通过this访问静态的成员变量吗?
虽然对于静态方法来说没有this,name在非静态方法中能够通过this访问静态成员变量吗?看下面这一段例子:
public class Main {
static int value = 33;
public static void main(String[] args) throws Exception {
new Main().printValue();
}
private void printValue() {
int value = 3;
System.out.println(this.value); // 输出 33
}
}
该程序运行的结果为33
在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够),推荐访问静态资源时使用类名直接访问而不是创建对象访问。
3.static能作用于局部变量吗?
在C/C++中static是可以作用于局部变量的,但是在Java中切记,Java语法规定static是不允许用来修饰局部变量的。
本文详细讲解了Java中static关键字的用途,包括为什么使用static、static的含义、static方法与非static变量的关系,以及static的使用误区,如静态方法不能直接访问非静态资源,static关键字不会改变访问权限等。
876

被折叠的 条评论
为什么被折叠?



