static修饰的内容:
static表示静态的意思,可用来修饰类变量,类方法。static主要用于创建独立于具体对象的域变量或者方法。
static修饰变量时,此静态变量为该类所有对象共享,非静态的变量是对象“私有”的,在每次创建对象时被初始化,存在多个副本,各个副本互不影响。而静态变量是对象共享的,若一个对象改变了其值,其他对象也会受影响。调用:其它类调用它时可以用类名直接调用该属性,也可以用该类对象调用。 静态 不能修饰局部变量!在类的内部,可以在任何方法内直接访问静态变量。在其他类中,可以通过类名访问该类中的静态变量。
public class Feibo {
static int age = 2; //使用static关键词声明静态变量
public static void main(String[] args) {
System.out.println(Feibo.age); //直接用类名访问静态变量
Feibo practice=new Feibo(); //创建类的对象
System.out.println(practice.age); //使用对象名访问静态变量
practice.age=3; //使用对象名修改静态变量
System.out.println(practice.age); /*使用对象名访问静态变量,发现静态变量的值已被修改,由于静态变量在被任何一个对象改变了数据后,其他对象的数据也会受到影响*/
}
}
static修饰方法时,叫静态方法或类方法。类方法如其名,也是通过类名直接调用或者对象调用,但由于它不依赖于对象就可以访问,因此对于静态方法来说就没有this.的。由于这个特性,静态方法中就不止直接访问非静态成员方法和非静态成员变量,因为非静态是属于对象的,静态属于类的。非静态的方法是可以访问静态的方法和变量的。静态方法不需要通过它所属的类的任何实例就可以被调用.静态方法中不能使用 this 关键字和 super 关键字。不能直接访问所属类的实例变量和实例方法。可以直接访问所属类的静态变量和静态方法。
对于普通方法: 普通方法是需要加载类new出一个实例化对象,通过运行这个对象才能运行代码块,而静态方法随着类加载就运行了。
对于静态方法: 在类加载时静态方法也加载了,但是必须需要类名或者对象名才可以访问,相比于静态代码块,静态方法是被动运行,而静态代码块是主动运行。
public class Feibo {
public static void print() {
System.out.println("123456"); //使用static关键词声明静态方法
}
public static void main(String[] args) {
Feibo.print(); //直接使用类名调用静态方法
Feibo pr=new Feibo();//创建类的对象
pr.print(); //使用对象名调用静态方法
}
}
static修饰类时,此类为内部类,静态内部类不需要有指向外部类的引用而非静态内部类需要持有对外部类的引用。
static修饰对象时,此对象在编译前就存在于内存中,所以不用new去创建了,可以直接用类名去调用。
stati修饰代码块时,此时该代码块和静态变量属于一个加载的优先级。静态变量丶静态代码块都是随着类的加载而加载,优先于构造方法丶构造代码块。静态变量丶静态代码块同时存在时,谁编写在上面谁先加载,遵循顺序结构。静态代码块中不能有任何方法体的存在,而且它不能直接访问静态实例和实例方法,需要通过类的实例对象进行访问。静态块只在类名首次出现时调用一次,以后再也不调用了。通常用于初始化类,为类的静态变量赋初始值。
public class Feibo {
static int a;
static {
a=3;
}
public static void main(String[] args) {
System.out.println(a);
}
}
二:子方法static去掉的报错(求平方数的静方法)的原因,例子
去掉子方法中的static后,该方法变为非静态方法,不可以被静态的主方法访问。
public class Feibo {
public static void main(String[] args) {
int result;
for (int x = 1; x <= 10; x++) {
result = square(x);
System.out.println("The square of " + x + " is " + result + "\n");
}
}
// 自定义求平方数的静态方法
public static int square(int y) {
return y * y;
}
}