Java基础语法:static修饰符
一、静态变量
描述:
- 在类中,使用'static'修饰的成员变量,就是静态变量,反之为非静态变量。
区别:
- 静态变量属于类的,可以使用类名来访问;非静态变量是属于对象的,必须使用对象来访问。
- 静态变量对于类而言在内存中只有一个,能被类的所有实例所共享;实例变量对于类的每个实例都有一份,它们之间互不影响。
- 静态变量在加载类的过程中分配内存,实例变量在创建对象时分配内存,所以静态变量可以使用类名来直接访问,而不需要使用对象来访问。
示例:
public class Student {
private static int age = 20;
private double score = 100;
public static void main(String[] args) {
Student student = new Student();
System.out.println(age);//20
System.out.println(Student.age);//20
/* 不建议使用对象访问静态成员 */
System.out.println(student.age);//20
System.out.println(student.score);//100.0
}
}
二、静态方法
描述:
- 在类中,使用'static'修饰的成员方法,就是静态方法,反之为非静态方法。
区别:
- 静态方法数属于类的,可以使用类名来调用;非静态方法是属于对象的,必须使用对象来调用。
- 静态方法不可以直接访问类中的非静态变量和非静态方法,但是可以直接访问类中的静态变量和静态方法;非静态方法可以直接访问类中的非静态变量和非静态方法,也可以直接访问类中的静态变量和静态方法。
注意:
- 'this'和'super'在类中属于非静态的变量,静态方法中不能使用。
- 父类的静态方法可以被子类继承,但是不能被子类重写。
- 父类的非静态方法不能被子类重写为静态方法。
示例:
public class Student {
private static int age = 20;
private double score = 100;
public static void staticSay() {
System.out.println(age);
}
public void say() {
System.out.println(age + " " + score);
}
public static void main(String[] args) {
Student.staticSay();//20
Student student = new Student();
/* 不建议使用对象调用静态方法 */
student.staticSay();//20
student.say();//20 100.0
}
}
三、静态代码块
描述:
- 在类中,使用'static'修饰的匿名代码块,就是静态代码块。
- 因为没有名字,在程序中并不能主动调用这些匿名代码块。
区别:
- 静态代码块是在类加载完成之后就自动执行,并且只执行一次;匿名代码块是在每次创建对象的时候自动执行的,并且在构造器执行之前执行。
- 静态代码块不可以直接访问类中的非静态变量和非静态方法,但是可以直接访问类中的静态变量和静态方法;匿名代码块可以直接访问类中的非静态变量和非静态方法,也可以直接访问类中的静态变量和静态方法。
- 静态代码块的作用是给类中的静态成员变量初始化赋值;匿名代码块的作用是给对象的成员变量初始化赋值,但是因为构造器也能完成这项工作,所以匿名代码块使用的并不多。
注意:
- 'this'和'super'在类中属于非静态的变量,静态代码块中不能使用。
- 在构造器中给静态变量赋值,并不能保证能赋值成功,因为构造器是在创建对象的时候才执行,但是静态变量可以不创建对象而直接使用类名来访问。
示例:
public class Student {
/* 静态代码块 */
static {
staticSay();
age = 10;
staticSay();
}
/* 匿名代码块 */
{
say();
age = 30;
score = 80.0;
say();
}
/* 构造器 */
Student() {
say();
age = 40;
score = 90.0;
say();
}
/* 静态成员变量赋初始值,定义在静态代码块之下,会比静态代码块后执行 */
private static int age = 20;
/* 非静态成员变量赋初始值,定义在匿名代码块之下,会比匿名代码块后执行 */
private double score = 100.0;
/* 静态方法 */
public static void staticSay() {
System.out.println(age);
}
/* 非静态方法 */
public void say() {
System.out.println(age + " " + score);
}
public static void main(String[] args) {
/*
本次执行顺序为:静态代码块-->静态成员变量赋初始值-->匿名代码块-->非静态成员变量赋初始值-->构造器
所以创建对象会在控制台依次打印:
0
10
20 0.0
30 80.0
30 100.0
40 90.0
*/
Student student = new Student();
student.say();//40 90.0
}
}
四、创建和初始化对象的过程
步骤:
- 类加载,同时初始化类中静态变量,赋默认值。
- 若静态变量有指定初始值,且代码定义在静态代码块之上,对静态变量进行显式赋值。
- 执行静态代码块。
- 若静态变量有指定初始值,且代码定义在静态代码块之下,对静态变量进行显式赋值。
- 创建对象,分配内存空间,同时初始化成员变量,赋默认值。
- 调用父类构造器。
- 若成员变量有指定初始值,且代码定义在匿名代码块之上,对成员变量进行显式赋值。
- 执行匿名代码块。
- 若成员变量有指定初始值,且代码定义在匿名代码块之下,对成员变量进行显式赋值。
- 执行构造器。
- 若有变量引用,返回内存地址赋给变量。
示例:
public class Person {
private int age = 10;
public Person() {
System.out.println("Person构造器");
print();
}
public void print() {
System.out.println("Person print方法: age = " + age);
}
}
class Student extends Person {
/* 赋初始值定义在匿名代码块之上,会比匿名代码块先执行 */
private int age = 20;
static {
System.out.println("Student静态代码块");
}
{
System.out.println(age);
System.out.println("Student匿名代码块");
}
public Student() {
System.out.println(age);
System.out.println("Student构造器");
}
public void print() {
System.out.println("student print方法: age = " + age);
}
public static void main(String[] args) {
/*
结果为在控制台依次打印:
Student静态代码块
Person构造器
student print方法: age = 0
20
Student匿名代码块
20
Student构造器
*/
new Student();
}
}
五、静态导包
描述:
- 静态导包就是java包的静态导入,用'import static'代替'import'来静态导入包,是JDK1.5中的新特性,意思是导入这个类里的静态方法。
- 静态导包的好处就是在有很多重复调用静态方法的时候可以简化一些操作,如果仅有一到两次调用,不如直接写来的方便。
示例:
import static java.lang.Math.PI;
import static java.lang.Math.random;
public class Test {
public static void main(String[] args) {
/* 非静态导入需要使用Math.random()的方式调用 */
System.out.println(random());//0.05775943381246629
System.out.println(PI);//3.141592653589793
}
}
Java基础语法:static修饰符的更多相关文章
- Java基础——protected访问修饰符探讨
Java基础——protected访问修饰符探讨 根据官方说法:(如图) protected修饰符是可以修饰其他包中的子孙类的,但是我做了个实验,结果发现了一个有趣的现象! 具体请往下看: packa ...
- Java中的Static修饰符
static(静态.修饰符):static修饰成员变量时:static修饰成员变量时,那么该成员变量的数据就是一个共享的数据. 静态成员变量的访问方式:方式一: 使用对象进行访问. 对象.属性名 方式 ...
- Java final和static 修饰符
一.final final是不变的,最终的意思.可以用来修饰变量,方法,类. 1. 修饰变量 private final int a = 2; private final int b; // fina ...
- 26.Java基础_状态修饰符
状态修饰符: final(最终态),static(静态) final关键字: 修饰类: 修饰局部变量: static关键字: 修饰变量: 修饰函数:
- java基础 关于final修饰符
final作为一个修饰符,可以修饰类.变量.函数. 1.被final修饰的类不可以被继承(保护封装性),为了避免被继承,被子类复写: 2.被final修饰的函数不可以被复写 3.被final修饰的变量 ...
- Java Basic Notes——static修饰符
1.static 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就 ...
- Java学习——使用Static修饰符
程序功能:通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. package Pack1; public class Try { public static vo ...
- JAVA基础语法——标识符、修饰符、关键字(个人整理总结)
JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1 什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...
- 2、Java 基础语法标识符、修饰符、变量、 数组、枚举、关键字
Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...
- java基础语法(标识符 修饰符 关键字)
标识符 用来表示类名,变量名,方法名,类型名,数组名,文件名的有效字符序列称为标识符. 1)只有字母(区分大小写),下划线,美元符号和数字组成,长度不受限制.注:字母包括英文26个字母 ,汉字,日 ...
随机推荐
- Java数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- Codeforces Round #672 (Div. 2)
比赛链接:https://codeforces.com/contest/1420 A. Cubes Sorting 题意 给出一个大小为 $n$ 的数组 $a$,每次只可以交换相邻的两个元素,最多交换 ...
- python+fiddler下载vip视频 && ts视频可合并
如果你只想在线看视频可以去看这篇博客:python实现通过指定浏览器免费观看vip视频 先看一下我们程序运行的结果 我们要解析的接口就是(就是这个"接口+视频地址"可以解析出vi ...
- 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)
题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...
- Codeforces Round #653 (Div. 3) C. Move Brackets
题意/题解:经典括号匹配题目,不多说了. 代码: int t; int n; string s; int cnt; int main() { ios::sync_with_stdio(false);c ...
- 如何用 4 个小时搭建一个新 “Clubhouse” ,引爆声音社交新风口
Clubhouse,基于实时音频技术的声音社交现象级火爆 最近,让硅谷两位顶级 VC 大打出手争相投资的 Clubhouse 火到了国内,甚至在社交圈里 "一码难求",此种火爆程度 ...
- 国产smartbits版本-minismb测试高恪路由器IP限速
Minismb测试仪表是复刻smartbits的国产版本,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数和 ...
- Kubernets二进制安装(1)集群,软件,IP规划
1.Kubernetes节点信息情况 主机名 简称 角色 IP地址 操作系统 mfyxw10.mfyxw.com mfyxw10 K8S代理节点1 192.168.80.10 CentOS7.7 mf ...
- LINUX - 通信
为什么三次握手: 让服务端和客户端都知道,自己的收信能力和发信能力没有问题: 第一次:客户端发给服务端--服务端知道了,自己的收信能力和客户端的发信能力没有问题: 第二次:服务端回复客户端--客户端知 ...