java静态变量、静态方法、代码块、main方法
文章目录
- 一、类变量 / 静态变量(static)
- 二、类方法 / 静态方法(static)
- 三、main方法
- 四、代码块
- (一)static代码块
- (二)普通代码块
- 五、属性初始化、代码块、构造器的调用优先级【超级重点】
一、类变量 / 静态变量(static)
(一)类变量也叫静态变量 / 静态属性,为同一个类所有对象共享,存储在堆中(在类加载时就创建了,即使没创建对象也可以使用)。
(二)定义语法:
访问修饰符 static 数据类型 变量名
例:public static int count = 0;
(三)如何访问类变量:
类名.类变量名
例:Person.name
【静态变量的访问修饰符的访问权限和范围和普通属性是一样的】
二、类方法 / 静态方法(static)
(一)定义语法:
访问修饰符 static 返回数据类型 方法名(){}
例:public static int getNum(){}
(二)如何访问类变量:
类名.类方法名【推荐】
例:Person.getNum()
【静态方法的访问修饰符的访问权限和范围和普通属性是一样的】
注意事项
- 静态方法不能使用和对象有关的关键字,例如this和super
- 静态方法只能访问静态变量或静态方法
- 普通成员方法可以访问非静态 / 静态的成员和方法
三、main方法
main方法的形式:
public static void main(Stringl args){}
- main方法时虚拟机调用
- java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
- java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static
- 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
- java执行的程序 参数1 参数2 参数3
注意事项
- 在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性;
- 不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员
四、代码块
代码化块又称为初始化块,属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过 { } 包围起来。
不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。
基本语法:
[修饰符]{
代码
};
说明注意:
1)修饰符可选,要写的话,也只能写static
2)代码块分为两类:使用static修饰的叫静态代码块;没有static修饰的,叫普通代码块/非静态代码块
3)逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)
4); 号可以写上,也可以省略。
5)静态代码块只能调用静态属性/方法,普通代码块可以任意
(一)static代码块
static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行(类什么时候被加载:看以下第二点),并且只会执行一次【重要】。如果是普通代码块,每创建一个对象,就执行。
类什么时候被加载【重要】
(1)创建对象实例
(2)创建子类对象实例,父类也会被加载
(3)使用类的静态成员时(静态属性,静态方法)
class AA{static {System.out.println("AA静态代码块被执行");}
}
class BB extends AA{{System.out.println("普通代码块被执行");}private int n2 = getN2();public static int n1 = getN1();static {System.out.println("BB静态代码块被执行");}public static int getN1() {System.out.println("n1初始化");return 100;}public int getN2() {System.out.println("n2初始化");return 200;}
}
//情况一:
//AA m1 = new AA();
//输出:AA静态代码块被执行
//情况二:
//BB m2 = new BB();
//输出:1.AA静态代码块被执行 2.BB静态代码块被执行
//情况三:
//System.out.println("输出:" + BB.n1);
//输出:1.AA静态代码块被执行 2.n1初始化 3.AA静态代码块被执行 4.输出:1000
(二)普通代码块
普通的代码块,在创建对象实例时,会被隐式的调用。被创建一次,就会调用一次。
如果只是使用类的静态成员时,普通代码块并不会执行。
使用场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的利用率(在调用构造时,先执行代码块的内容,再执行构造器的内容)
public class Hello {public static void main(String[] args) {Movie movie1 = new Movie("lihua", 199);Movie movie2 = new Movie("wangming", "你好");}
}
//以下两个构造器都使用代码块
class Movie{private String name;private double price;private String directer;public static int n1 = 10000;{System.out.println("电影已创建");}public Movie(String name, double price) {this.name = name;this.price = price;}public Movie(String name, String directer) {this.name = name;this.directer = directer;}
}
五、属性初始化、代码块、构造器的调用优先级【超级重点】
在对象创建时,属性初始化、代码块、构造器的调用优先级如下:
①父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
②子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
③父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
④父类的构造方法
⑤子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
⑥子类的构造方法
静态是在加载时就被调用,所以优先级最高;子类构造器中隐含调用super()和子类普通代码块,所以先父类再子类普通代码块
public class Hello {public static void main(String[] args) {AA a = new AA();}
}
class BB{//7.父类构造器public BB(){System.out.println("父类BB构造器被执行");}//5.父类普通属性private int n1 = getN1();//6.父类普通代码块{System.out.println("父类BB普通代码块被执行");}//1.父类静态代码块static {System.out.println("父类BB静态代码块被执行");}//2.父类静态属性public static int n0 = getN0();public static int getN0() {System.out.println("父类静态属性n0初始化");return 0;}public int getN1() {System.out.println("父类普通属性n1初始化");return 100;}
}
class AA extends BB{//10.构造器public AA(){//隐含 super()和调用普通代码块System.out.println("子类AA构造器被执行");}//8.普通代码块{System.out.println("普通代码块被执行");}//9.普通变量初始化private int n3 = getN3();//3.静态变量初始化public static int n2 = getN2();//4.静态代码块static {System.out.println("子类AA静态代码块被执行");}public static int getN2() {System.out.println("子类静态属性n2初始化");return 200;}public int getN3() {System.out.println("子类普通属性n3初始化");return 300;}
}
输出:
父类BB静态代码块被执行
父类静态属性n0初始化
子类静态属性n2初始化
子类AA静态代码块被执行
父类普通属性n1初始化
父类BB普通代码块被执行
父类BB构造器被执行
普通代码块被执行
子类普通属性n3初始化
子类AA构造器被执行
特别说明
本文章是个人整理的学习笔记,参考b站韩顺平老师的课程(【零基础 快速学Java】韩顺平 零基础30天学会Java)。老师讲的非常好,有兴趣的可以去看一下。
java静态变量、静态方法、代码块、main方法相关推荐
- Java 静态变量,静态方法,静态常量(java static 关键字)
Java 静态变量,静态方法,静态常量 就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...
- (工作笔记)jmockit的使用-mock私有变量、静态变量、代码块
目录 一.jmockit配置 二.实例 2.1 被测对象 2.2 测试类 一.jmockit配置 变量 <properties><jmockit.version>1.43< ...
- java静态变量存放在堆还是方法区?
首先肯定:静态变量是被对象共享的,随着类加载而产生(不用实例化即可访问) jdk8之前:放在方法区 jdk8及以后:存放在堆中反射的class对象(即类加载后会在堆中生成一个对应的class对象)的尾 ...
- 【Java基础】Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)
初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 3.其次,初始 ...
- [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍
参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中 方法外 调 ...
- Java 静态变量和静态方法
在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有. 静态成员不依赖于类的特定实例,被 ...
- Java中的静态变量静态方法
静态变量&静态方法 静态变量又叫做类变量,静态方法又被称为类方法--均被static修饰 未被static修饰的成员变量和方法分别被称为实例变量和实例方法 (1)静态方法中不需要它所属类的任何 ...
- java 静态变量生命周期(类生命周期)
java 静态变量生命周期(类生命周期) Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 ...
- Java 静态变量生命周期
Java 静态变量生命周期(类生命周期) Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 ...
最新文章
- HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...
- 导出excel--多个sheet
- 【正一专栏】如果世界杯上没有了意大利
- springboot集成shiro实现注册、登录、退出功能
- http使用post上传文件时,请求头和主体信息总结
- java 抽象类构造函数_抽象类可以有构造函数吗?
- Windows下Zookeeper启动zkServer.cmd闪退问题的解决方案
- 阿里前端开源的一些产品
- 探寻 Redis 内存诡异增长的元凶
- 「题解」:[BZOJ4558]方
- 新华网评:企业的信息安全关把好了吗?
- [深入Python]Alex Martelli的Borg类
- html中如何设置ttf,CSS怎么引用外部ttf字体?
- sklearn笔记19 随机森林和决策树的比较
- 启动服务器后台打印系统,服务器打印后台处理
- pyomo / Ipopt : Error evaluating constraint 1: can‘t evaluate pow‘(0,0.5).
- 怎么把m4a转换成mp3格式?
- 2021-02-03-隐藏Tomcat版本号
- 数据恢复软件如何恢复电脑删除的文件
- cv2绘图 cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText() python
热门文章
- 淫欲的真相是什么呢?可能很多英雄豪杰都没有想到过
- 部署无鱼工时系统,超详细教程,并成功部署
- 数据挖掘时功能和一个聚类分析应用案例
- 小编为您介绍留声机的古与今
- 前端、数据库面试要点
- Android爬虫(一)使用OkHttp+Jsoup实现网络爬虫
- python豆瓣mysql_python爬虫获取豆瓣电影——Python操作MySQL存储数据
- ngx-datatable的使用
- Jekyll 教程——博客功能(blog)
- 初始化mysql5.7.18_MySQL5.7.18,初始化完成登录,提示密码过