目录
一:static关键字的用法
1.1 static关键字的优缺点
优点:
属于类级别的,不需要创建对象就可以直接使
全局唯一,内存中唯一,静态变量可以唯一标识某些状态.
在类加载时候初始化,常驻在内存中,调用快捷方便.
缺点:
静态方法不能调用非静态的方法和变量。(非静态方法可以任意的调用静态方法/变量)
不能使用this和super关键字(属于类级别,没有创建对象则不可用this/super)
1.2 static关键字修饰变量
1.static修饰的变量也称为静态变量,定义在类的方法外面,不能在类的方法里面,类的方法里面是局部变量。
2.静态变量和非静态变量的区别是:
静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化,而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
3.static成员变量的初始化顺序按照定义的顺序进行初始化。
4.static关键字并不会改变变量和方法的访问权限(public,private,protected)。
5.需要记住的是:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要权限足够)。
1.3 static修饰方法, 静态方法
1.由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。虽然对于静态方法来说没有this,但是我们在非静态方法中能够通过this访问静态方法成员变量。
2.静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
3.非静态方法可以访问静态成员变量和静态方法.
1.4总结
1.非静态方法可以访问静态和非静态的成员变量(不论访问权限是public,private,protected),静态方法只可以访问静态成员变量(不论访问权限publi,private,protected)
2.private权限的静态成员变量,不能通过类名和对象访问。
protected权限的静态成员变量,可以通过类名和对象访问。
public权限的静态成员变量,可以通过类名和对象访问。
3.静态成员变量的值改变,所有该类对象中该静态成员变量的值都改变了。
Java中的static关键字不会影响到变量的变量或者方法的作用域。
在Java中能够影响到访问权限的只有private、public、protected这几个关键字。
import java.lang.String;
class StaticMember{
protected float number = 3.14F;
protected static float f = 3.14F;
static int years =365; //定义了一个静态成员变量
private static int month = 12; //定义了一个私有的静态成员变量
String name = "hejunran"; //非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
// 非静态方法
public void print(){
/* 原因是用了public,private,static等修饰词去修饰方法内部变量,
* 然而在java类的方法里声明变量时,只能用final修饰(only final is permitted)(或者不加修饰)。
* 除此之外不能用其他的修饰符修饰,包括static也会报同样的错误。
* public,private等是声明作用域的。方法内部定义的变量(只能在方法内部使用),
* 在里面声明作用域无意义,也禁止声明。
*/
// 总结: 方法里面不可以定义 公共的,私有的变量(方法里面本身就是局部变量)
// static String name ="hejunran"; 这是不能声明的。
// public String name ="hejunran";
final String NAME= "hejunran"; // 定义了一个常量,方法里面不可以定义静态常量。
System.out.println(years); // 非静态方法调用静态成员变量
System.out.println(this.years); // 非静态方法调用静态成员变量
System.out.println(month); // 非静态方法调用私有静态成员变量
System.out.println(name); // 非静态方法调用非静态成员变量
System.out.println(number);
prints(); // 非静态方法调用静态方法
}
// static方法一般称作静态方法
public static void prints() {
// print(); //调用非静态方法报错
System.out.println(month); //
System.out.println(years);
// System.out.println(number); // 非静态成员变量不能被静态方法访问,编译会报错。
// System.out.print(name); // 非静态成员变量不能被静态方法访问,编译会报错。
}
}
public class StaticStudy {
static int value =11;
private void printValue() {
int value = 22;
System.out.println(this.value);
}
public static void main(String[] args) {
// 此处输出的值为11,而不是22,那是因为this是表示当前对象,
// 通过new创建对象,static静态变量value一起初始化,this调用当前成员变量
// 在printValue方法内部的value是局部变量,根本不可能与this关联.
new StaticStudy().printValue();
System.out.println(StaticMember.years);
// System.out.println(StaticMember.month); // 私有的静态成员变量是不能被访问的
// System.out.println(StaticMember.name); // 非静态变量和方法只能通过对象访问
// StaticMember.print(); // 非静态变量和方法只能通过对象访问
StaticMember.prints();
StaticMember s1 = new StaticMember();
StaticMember s2 = new StaticMember();
System.out.println(s1.years);
System.out.println(s2.years);
System.out.println(s1.name);
System.out.println(s2.name);
// System.out.println(s1.month); // private私有化的(静态和非静态的)成员变量是不能被类名和对象直接访问的。
System.out.println(s1.number); // protected (静态和非静态的)成员变量可以被对象访问,静态的protected可以通过类名。成员变量 的方式直接访问
// System.out.println(StaticMember.number); // number 非静态成员,不能通过类名直接访问
System.out.println(StaticMember.f);
System.out.println(s1.f);
s1.print();
System.out.println("************************");
// 发现s1中的静态成员变量值改变之后s2也改变了 ,这是因为静态变量在类初始化时就被固定在内存中,是被多个对象共享的
s1.years=255;
System.out.println(s2.years);
System.out.println(StaticMember.years);
}
}