持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
修饰属性
static 关键字可以用来修饰属性,也就是用来修饰变量。
在类中被 static 关键字修饰的变量,我们称之为 ”类变量“ 或是 ”静态变量“。
语法结构:在数据类型之前加上 static 关键字。
[private|public|protected] static 数据类型 变量名;
在全局中,也就是类体中声明两个变量,如下:
//成员变量
int i = 10;
//静态变量、类变量
static int j = 20;
程序在编译的时候出错了,告诉我们 “无法从静态上下文中引用非静态变量 i” ,从错误的提示信息中我们可以看到,i 在 main 方法中是无法直接访问的,需要和对象绑定才可以使用;但是 j 没有问题,可以在 main 方法中直接使用。
🤔 那么要如何修改,才能使用呢?
变量 i 需要和对象绑定才能访问。
System.out.println(j);
test1 ts = new test1();
System.out.println(ts.i);
这样编译就能通过了,打印输出「20」 「10」。
从截图可以发现,我们修改ts对应j,但是ts1也同样改变了,这是因为静态变量只有一份
从以上一系列的结果,我们可以总结出:
- 静态方法访问非静态变量,需要通过对象
- 成员变量,每个对象各自有一份。
- 静态变量或类变量,全局只有一份。
修饰方法
static 关键字修饰方法,我们称之为 “静态方法”。
其实我们一直到使用的 main 方法就是一个被 static 修饰的静态方法。
成员变量 i 不能直接在 main 方法中使用,就说明非静态成员不能在静态方法中使用。
语法结构:在方法返回类型之前加上 static 关键字。
[public|protected|private] static 返回值类型 方法名(参数列表){
方法体
}
在静态方法调用非静态,会报错(method2修改,加static)
静态方法 method1() 中,非静态的成员都不能再静态方法中进行访问;在static方法中都不能再声明静态的变量。
method2() 是非静态方法,它可以访问外部的静态和非静态的成员。
我们声明静态方法,其中一个目的是,它的调用不在需要和对象进行绑定,直接可以通过类名访问。
Test2.method1();
new Test2().method2();
static 关键字修饰语句块
static 关键字还可以修饰语句块,被 static 关键字修饰的语句块我们称之为静态块,否则称之为初始化块。
语法结构:在语句块之前加上 static 关键字。
static {
// 静态区域中不能访问外部非静态的成员
}
注意:
- 对静态块而言,只要加载该类,就会执行静态块的内容,但只会执行一次。
- 对初始化块而言,只有创建对象时,会去执行的部分,创建 n 个对象,就执行初始化块 n 次
静态方法可以被静态方法访问
静态方法可以被实例方法访问
实例方法可以被实例方法访问。
实例方法不能被静态方法访问。
相关题目:
看了上面是不是感觉好像还行,这里我们看看相关题目把
第一题
这个其实是一个选择题,大家猜猜能不能通过或者输出是多少? 答案是:5 解析:程序执行流程,
- 先static后非static(static包括静态方法和静态代码块,同时存在先静态代码块,再静态方法)
- 先父类后子类(例如调用子类构造方法之前调用父类构造方法)
第二题
答案是:3
静态成员变量 i 是被每个对象所共享的,所以 3 次产生对象调用构造函数后,i 的值由默认值 0 变为 3。
第三题
同理和上面一个类型差不多的;
答案·101
s2.i = 100; 之后,对象 s3 被 new 出来,所以 i++ 变为 101。
第四题
答案:11 12
static 静态块优先执行,i 为 10,之后每产生一个对象 i++,所以答案为:11 和 12。
第五题
静态块在类加载到 JVM 时运行,而不是在 new 对象时调用。
第六题
答案:2
1、静态方法可以被继承,但是不能重写。
2、如果子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写。
3、这里就是调用了子类的 eat 方法