static关键字
- 静态static关键字
- 静态static关键字修饰成员变量
- 静态static关键字修饰成员方法
- static内存图
- 静态代码块
首先笔者通过视频的学习,来总结学习知识,避免遗忘,应对接下来的校招。
今天来解释一下在初涉编程语言时,总是让人搞不清楚用途的static关键字,用比较简单的方法介绍一下。
静态static
这是个什么意思呢,静态,顾名思义,就是不动的,就是不管外界怎么变化,我就在那里不会理你。相当于说他有一套自己的规则区别于你们一般的人。
再来举例一个简单的比喻:
笔者和我的同学,都属于17级xxx系xxx专业xx班的一个同学,我们有一个共同的特点,就是我们都是学生。那么我们的共同拥有的属性,名字,性别,年龄 ,班级等,组合在一起就是一个学生类,现在声明了几个对象,赋予了不同的姓名,年龄等等,但是班级确实一样的,并不会随着我们不同的人不一样就改变,那么班级就是一个静态的。
我这么说大概就有了一点理解了吧。
修饰成员变量
如果一个成语那变量使用了static关键字,那么这个变量就不再属于自己了,而是属于变量,多个对象共享同一份数据。
什么意思呢?
用一段简单的代码来说明一下:
public class student {
static String classRoom;
String name;
int age;
public student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class staticDemo {
public static void main(String[] args) {
student one = new student("yy",19);
one.classRoom = "XXX班";
System.out.println(one.name + one.age + one.classRoom);
student tow = new student("ll",23);
System.out.println(tow.name + tow.age + tow.classRoom);
}
}
这两段代码不太严谨,但是为了演示方便,我就为了方便先这么写,如果run一下就会发现,两个对象的classRoom的值是相同的,但是我们只修改了one的值,现在大概就能明白了一点了吧,静态static就是通过这个类所定义的所有对象,都共享同一个值,改变了一个,全部都要改变,但是这种说法还不太严谨,到这里先这样说。
静态static修饰成员方法
一旦用了static修饰成员方法,那么这个方法就成了一个静态方法,静态方法不属于对象,而属于类的。
如果没有static关键字,那么必须先创造对象,然后通过对象才能使用它。
如果有static关键字,那么不需要创造对象,直接通过类名就可以使用它。
什么意思?通过一段简单的代码就能明白了。
public class student {
static String classRoom;
String name;
int age;
public student(String name, int age) {
this.name = name;
this.age = age;
}
public void example_one(){
System.out.println("成员方法调用了");
}
public static void example_tow(){
System.out.println("静态方法点用了");
}
}
public class staticDemo {
public static void main(String[] args) {
student one = new student("yy",19);
one.classRoom = "XXX班";
//调用成员方法
one.example_one();
//调用静态方法
one.example_tow(); //正确,但不推荐使用
student.example_tow();//正确,推荐使用
}
}
我重写了之前的两段代码,加入了两个成员方法,其中的一个就是静态的,然后调用了两个方法。
成员方法的调用我就不说了,大家都在用。主要是在于静态方法,以上两种,用类和对象都可以调用,但是你在写的时候就能发现,编译器可能也会推荐你使用第二种方法,为什么会有两种方法呢?就是上面我所说的,静态方法不属于对象,而属于类。同理静态成员也如此,所以我建议把前面的一句代码也改一下:
one.classRoom = "xxx班";
//改为
student.classRoom = "xxx班";
总结如下:
无论成员变量还是成员方法,如果有了static,都推荐使用类名称来进行调用
静态变量:类名称.静态变量
静态方法:类名称.静态方法()
关于静态方法还有几点注意事项:
1、静态不能直接访问非静态
原因,因为内存当中是先有了静态内容,后又了非静态内容
2、静态方法不能用“this”
原因,this代表当前对象,谁调用方法,谁就是当前对象
写端代码,应该就能明白了:
public class student {
static String classRoom;
String name;
int age;
public student(String name, int age) {
this.name = name;
this.age = age;
}
public void example_one(){
System.out.println("成员方法调用了");
name = "yy";
classRoom = "xxx班";
System.out.println(this);
}
public static void example_tow(){
System.out.println("静态方法调用了");
//name = "yy"; 代码会报错
classRoom = "xxx班";
// System.out.println(this); 代码会报错
}
}
以上代码有兴趣可以去run一下试试,就能明白其中的结果了。
静态static的内存图
上面这张图的意思就是很明显,static申请的变量,他是存储在方法区的一个专门的区域,叫做静态区,类调用的时候不会去堆里寻找,而是直接渠道方法区。
静态代码块
等会一段代码直接上,首先我们必须要记住两点
1、静态代码块执行唯一一次。
2、静态内容总是优先于非静态,所以静态代码块比构造方法限制性
public class person {
static {
System.out.println("静态代码块运行了");
}
public person() {
System.out.println("构造方法执行了");
}
}
public class staticDemo {
public static void main(String[] args) {
person one = new person();
}
}
自己去试一下就能明白了。
静态代码块的典型用途:
用来一次性对静态成员变量进行赋值