static关键字
成员变量+static=静态变量
当我们在设计类的时候 发现多个对象中有共享数据的时候 我们就可以把这个共享的数据 定义为静态的
name age虽然每个对象都有 但是值不一定一样 对象的特有数据->成员变量
country虽然每个对象也都有 但是值一样 对象的共有数据-> 静态变量
静态的东西从堆中对象的空间里抽取出来了 放到哪里了呢?静态方法区。例:
大家伙来公司上课 你要喝水 水杯/水壶?特有 饮水机?共有
上述可以知道 共有的数据存在于一个特定的空间 静态方法区
你来公司上课 饮水机在 你下课回家 饮水机还在
上述又说明一个问题 共有的数据 要 活的比 对象 长成员函数+static=静态函数
静态函数意味着就是对象的共有行为吗?不行的
我们当前的成员函数如果不访问任何成员变量的情况下 这个函数就可以定义为静态的
这就意味着 静态函数不能直接调用当前类中的成员变量 无法从静态上下文中引用非静态
为啥?静态的生命周期要长于对象所以静态是优先于对象存在的静态也称之为是类的成员,我们可以直接通过类去调用类.(点)静态成员
特别提醒:为什么主函数是静态的?
1、主函数是程序的入口,优于其它运行
2、假设主函数是非静态的 那么必须先创建对象 才能调用主函数
3、怎么去创建对象呢?是不是需要写代码?这段代码咋运行呢?静态变量有没有默认初始化值?有 (运行时常量 永久代 JVM)
也有显示初始化静态变量与成员变量的区别:
1.生命周期
成员变量随着对象的创建而创建 随着对象的消亡而消亡
静态变量随着类的加载而创建 随着程序结束而消失
2.调用方式
成员变量必须先创建对象 在通过对象去调用
静态变量可以被对象调用 也可以直接用类调用
3.存储位置
成员变量存在于堆内存中对象的所属空间里
静态变量存在于静态方法区中类的所属空间里
4.命名
成员变量-对象的特有属性
静态变量-对象的共有属性 类成员代码块:
代码块 { ... }
局部代码块:存在于函数当中(包括函数) for(){...} if(){...}
构造代码块:直接在类中出现的{...}
当对象创建一次 构造代码块执行一次
作用等同于构造函数静态代码块:直接在类中出现的static{...}
当类被加载的时候 仅且只执行一次
作用于 对类进行一些初始化操作 JDBC具体的代码实现:
class ExtendsDemo02{
public static void main(String[] args){
Zi zi=new Zi();
System.out.println(zi.num1);//20
System.out.println(zi.num2);//30
System.out.println(zi.num3);//50
zi.show();
zi.sing();
}
}
//子父类中成员变量的特点
/*
class Grandfather{
int num1=100;
int num4=200;
}
*/
class Fu {//extends Grandfather{
int num1=10;
static int num2=40;
static int num3=50;
Fu(){
super();//Object(){} 显示初始化父类空间中的成员变量
System.out.println("Fu constructor1......");
}
Fu(int num){
System.out.println("Fu constructor2......");
}
void sing(){
System.out.println("Fu sing......");
System.out.println("爸爸我会唱红歌");
}
}
class Zi extends Fu{
int num1=20;
static int num2=30;
Zi(){
this(0,0);
System.out.println("Zi constructor1......");
}
Zi(int num1){
this(0,0);
System.out.println("Zi constructor2......");
}
Zi(int num1,int num2){
super();
System.out.println("Zi constructor3......");
}
void show(){
//局部变量和成员变量如果重名了 this区分
System.out.println(num1+","+num2+","+num3);
//局部变量/成员变量和父类变量重名了 super区别 super.xxx => 你爸爸的xxx
System.out.println(super.num1+","+super.num2+","+num3);
//System.out.println(super.super.num1);
//System.out.println(num4);
}
@Override
void sing(){
System.out.println("Zi sing......");
System.out.println("儿子我会唱摇滚、民谣、爵士、蓝调、电子");
}
}