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个字母 ,汉字,日 ...
随机推荐
- docker 搭建 nginx负载均衡
本文描述如何在一台机器上搭建nginx负载均衡,我将会启动3个nginx的docker,分别是1台前置nginx负责分发,后面2台负责处理请求. 首先我切换到/usr/local/docker/文件夹 ...
- PAT甲级—暴力搜索
1091 Acute Stroke (30point(s)) 基础的搜索,但是直接用递归会导致段错误,改用队列之后就不会了,这说明递归调用在空间利用率上还是很吃亏的. #include <cst ...
- hdu5893 List wants to travel(树链剖分+线段树)
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...
- 【51nod1674】区间的价值 V2(算法效率--位运算合并优化+链表实现)
题目链接: 51nod1674 题意:规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积.现在l有一个 N 个数的序列,问所有n*(n+1)/2个区间的贡献的和对1 ...
- 最小生成树 Prim和Kruskal
感觉挺简单的,Prim和Dijkstra差不多,Kruskal搞个并查集就行了,直接上代码吧,核心思路都是找最小的边. Prim int n,m; int g[N][N]; int u,v; int ...
- Leetcode(213)-打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在 ...
- codeforce 855B
B. Marvolo Gaunt's Ring time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Leetcode(35)-搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 这个题目很简单,因为它是给定的排序数组而且没有重 ...
- 深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!
英文:https://arpitbhayani.me/blogs/string-interning 作者:arpit 译者:豌豆花下猫("Python猫"公众号作者) 声明:本翻译 ...
- Androidstudio 新GradlePlugin和Gradle Version对应关系
Project Gradle AS建议升级到4.2. Plugin对应AS的版本,Plugin工具也要和Gradle对应上,否则某些语法不支持,如果是非必要的建议不要轻易升级. Gradle DSL ...