1 静态static
一个类可以创建n个对象,如果n个对象中的某些数据需要n个对象共享,就需要使用static关键字修饰这些数据。
1.1 static的作用
在同一个类的对象中共享数据。
1.2 static的修饰属性
使用static修饰的属性称为静态属性或类变量。使用static修饰的属性属于类,不属于具体的某个对象。类属性在类名首次出现时初始化,即使没有创建对象,类属性也是存在的。
1.3 static的修饰方法
用static修饰的方法称为静态方法或者类方法,类方法不依赖于任何对象,用类名直接加" . "调用即可,对象名也可以调用。使用static修饰的方法属于类,不属于具体的某个对象。类方法在类名首次出现时初始化,即使没有创建对象,类方法也是存在的。
例:在person类中定义静态的showDetails()方法,并调用。
public class Person {
//定义静态方法
public static void showDetails(String name,int age){
System.out.println("自我介绍一下,姓名:" + name + ",年龄:" + age);
}
public static void main(String[] args) {
Person.showDetails("李逵",20);//类名直接调用静态方法
Person person = new Person();
person.showDetails("阮小二",19);//对象名调用静态方法,不推荐
}
}
运行结果如下:
1.4static块
类名首次出现时,先为静态变量分配内存,然后调用静态块,静态块可以为静态变量初始化。还可以干别的事情。
静态块只在类名首次出现时调用一次,以后再也不调用了。
例如:
public class Demo{
//构造为实例变量初始化
public Demo(int i){
this.i = i;
}
//静态块,为static变量初始化,静态块在首次类名出现时调用,但后于分配静态变量。
static{
age = 20;
}
static int age=0;
int i;
}
2 实例
2.1 实例的定义
实例,也叫对象,就是new出来的堆的内存空间,实例是每个对象专有的,每new一次就分配一次内存。
2.2 实例化
new就是实例化的意思,new也是分配内存的意思
类名 对象名 = new 类名();
实例
Student s1 =new Student();
Student s2 =new Student();
2.3实例变量
没有被 static 修饰的成员变量被称为实例变量。
2.4实例变量的调用
在类的内部,任何非静态方法内可以直接访问实例变量;在其他类中,可以通过对象访问实例变量。
3 静态与实例的区别
- 实例变量是在new类时在堆中分配内存的。
- 构造函数可以为实例属性初始化。构造函数不会为静态属性初始化。
- 由于静态属性是所有对象共有的,所有对象不就是类吗,因此静态属性也称为类属性,或者类变量,或者类成员。
- 既然静态属性属于类,不属于某个具体的对象,因此在new对象时,不会给静态属性分配内存。那静态时什么时候分配内存呢?
- 当在程序运行期间,首次出现类名时,会暂时停止程序运行,去为类的静态属性分配内存,然后继续运行。
- 静态变量被分配在方法区中,常驻内存,永不回收。静态变量只有一份。相当于c语言的全局变量。
- 静态变量由类名操作,由类名赋值,取值。
- 类名调用静态属性时,可以省略类名。