public class TestDemo {
public static void main(String[] args) {
People people1 = new People(“王昭君”, 18);
People people2 = new People(“赵云”, 20);
People people3 = new People(“安琪拉”, 19);
People people4 = new People(“吕布”, 21);
People people5 = new People(“貂蝉”, 20);
}
}
☛在TestDemo中我们new了5个对象,调用了5次People类中的构造函数,那么count值为多少呢?因为每new一个对象,在堆上开辟一个对象,我们知道对象的内存布局分为三部分,对象头、实例变量、内存填充,一个对象一份实例变量,所以我们虽然new了5个对象,只是在每个对象中实现了count++,count的值都为1;
☛那么怎么用count来实现统计对象的个数呢?也就是让每个对象共用一份变量?这就要引入static关键字啦!
当类中的变量用static关键字来修饰的时候,变量就变成了静态变量。静态变量是随着类的字节码的加载而被加载进内存的,所以只要程序一启动运行到该类时就会被加载进内存,不管创建了多少个对象在内存中只存储一份,跟对象无关。它是保存在方法区当中的,无论多少个对象该静态变量在内存中都只有一份。
修改上述示例中的代码,count用static关键字来修饰。
People类
public class People {
//实例变量
private String name;
private int age;
private static int count;//用来统计对象的生成个数
//构造方法
public People(String name, int age) {
this.name = name;
this.age = age;
count++;
}
//实例方法
public void work() {
System.out.println(“好好学习,年薪百万,迎娶白富美!”);
}
public int getCount() {
return count;
}
}
静态变量是使用类名直接调用的,在以前我们设计一个类,如果把类中的实例变量设为公有或默认包访问权限的情况下,是可以通过类生成的对象来访问的;而静态变量只和类有关,可以用类名来访问(在静态变量设为公有或默认包的情况下)
静态变量和实例变量的区别
注意:静态变量是定义在类中,方法体外面的。如果你清楚JVM,应该知道局部变量是保存在栈中的,而静态变量是保存在方法区中的,局部变量出了方法就被栈回收了,而静态变量不会,所以局部变量前不能加static关键字。
2.static修饰方法
在写代码过程中,我们有没有发现有些方法是通过创建对象的方式调用的,如常见的在键盘上输入一个整数,Scanner scanner = new Scanner(System.in); scanner.nextInt();而有的方法是通过类名直接调用的,比如 Arrays.copyOf();那么什么情况下可以直接用类名调用而不用间接的通过对象呢?这就与static关键字修饰方法有关了。
看这样的一个栗子,把上述中static关键字修饰变量的示例中People类的getCount()方法设计成静态方法。
代码如下:
public class People {
//实例变量
private String name;
private int age;
public static int count;//用来统计对象的生成个数
//构造方法
public People(String name, int age) {
this.name = name;
this.age = age;
count++;
}
//实例方法
public void work() {
System.out.println(“好好学习,年薪百万,迎娶白富美!”);
}
public static int getCount() {
return count;
}
}
在TestDemo测试类中用类名调用一下getcount方法:
public class TestDemo {
public static void main(String[] args) {
People people1 = new People(“王昭君”, 18);
People people2 = new People(“赵云”, 20);
People people3 = new People(“安琪拉”, 19);
People people4 = new People(“吕布”, 21);
People people5 = new People(“貂蝉”, 20);
int sum = People.getCount();
System.out.println(sum);
}
}
运行结果:
同时也验证了,静态变量跟对象无关,只和类有关,测试类中产生了5个对象,每产生一个对象调用一次构造函数,count++;故最后count的值为5。
静态方法和实例方法的区别
在静态方法中不可以出现实例变量,而在实例方法中可以出现实例变量,也可以出现静态变量。
因为在实例方法中有隐含的this,举个栗子,在上述People类中添加一个实例方法eat;
public void eat() {
this.name = “高富帅”;
count = 1;
}
在实例方法中实例变量是否有this关键字都可以,因为实例方法会提供对象(this),就是指的是当前对象;当然在实例方法中也可以包含静态变量,静态变量不需要提供this,而实例方法会提供,静态变量要不要this就是它自己的事了,也就是给静态变量提供this,可以不要。
静态方法是不会提供this的,实例变量需要this,静态方法提供不了,故在静态方法中不能包含实例变量,如下:
3.类的初始化顺序
首先我们先引入静态块和实例块的概念,静态块是用来初始化静态变量的,实例块是用来初始化实例变量的。
设计一个A类如下:
public class A {
//实例变量
private int a;
//静态变量
private static int b;
//静态块
static {
System.out.println(“静态块”);
}
//实例块
{
System.out.println(“实例块”);
}
//构造函数
public A(){
System.out.println(“构造函数”);
}
}
为了能够在类的初始化顺序中看到实例变量和静态变量的初始化顺序,改进代码如下:
class B {
public B() {
System.out.println(“实例变量”);
}
}
class C {
public C() {
System.out.println(“静态变量”);
}
}
public class A {
//实例变量
private B a = new B();
//静态变量
private static C b = new C();
//静态块
{
System.out.println(“静态块”);
}
//实例块
{
System.out.println(“实例块”);
}
//构造函数
public A(){
System.out.println(“构造函数”);
}
}
初始化实例变量a的时候必定会调用B类的构造函数,初始化静态变量b的时候必定会调用C类的构造函数。
在TestDemo测试类中生成A的对象,并查看运行结果。
public class TestDemo {
public static void main(String[] args) {
A aa = new A();
}
}
运行结果:
通过运行结果可以发现,在生成对象,调用构造函数之前还搞了很多东西。
所以类的初始化的顺序静态变量、静态块、实例变量、实例块、构造函数
4.单例模式
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例,也就是只能产生一个对象。
懒汉单例模式
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
不成体系的自学效果低效漫长且无助。**
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-Z7qP9WSX-1715701881427)]
[外链图片转存中…(img-VdadNpg8-1715701881428)]
[外链图片转存中…(img-0qfZtrR5-1715701881428)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!