作者:孙玉昌,昵称【逐个哥】,另外【壹壹哥】也是我哦
千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、优质作者
配套开源项目资料
Github地址: 逐个哥/从零开始学Java
Gitee地址: 逐个哥/从零开始学Java
前语
在前一篇文章中,壹哥给咱们讲解了abstract关键字,然后让咱们把握了笼统类与笼统办法的特性。除此之外,面向目标的核心润饰符还有static和final。今天这篇文章,壹哥会持续带领咱们学习static关键字的特性,请各位打起精神来吧。static关键字是Java开发中很常用也很重要的一个关键字,咱们必须要搞清楚哦。
——————————前戏已做完,精彩即开始—————————-
全文大约【3300】 字,不说废话,只讲能够让你学到技术、了解原理的纯干货!本文带有丰厚的事例及配图视频,能够让你更好地了解和运用文中的技术概念,并能够给你带来具有满足启迪的思考……
一. static关键字
1. 简介
在Java中,static表明 “静态的” ,它也是一种润饰符,能够润饰特点、办法、代码块和内部类。
2. 特性
static润饰符具有如下特性:
- 被static润饰的特点(成员变量)称为静态变量,也叫做类变量;
- 被static润饰的常量称为静态常量;
- 被static润饰的办法称为静态办法,也叫做类办法;
- 被static润饰的代码块叫做静态代码块;
- 被static润饰符的内部类,叫做静态内部类。
其中,静态变量、静态办法、静态常量统称为类的静态成员,归整个类一切,不归于某个单一的目标。也就是说,静态成员不归于某个目标单独具有,而是被类的一切实例目标同享。举个例子,咱们在教室里放了一台饮水机,这台饮水机是本教室一切成员同享的,不归于张三,也不归于李四,这台饮水机就是”静态成员“。而每个人还能够有自己单独的一个水杯,张三、李四都有自己独有的水杯,水杯不是同享的。另外,默认情况下,这些水杯是不能混用的,张三和李四互相的水杯是互相阻隔的。也就是说,自己的隐私不可被侵略和窥视。
所以,静态成员不需求经过目标来进行拜访,而是直接经过类来拜访。只需这个类被加载,Java虚拟机就能够依据类名找到它们。咱们调用静态成员的语法格局如下:
类名.静态成员
3. 留意事项
依据以上特性,咱们需求留意以下几点:
- static关键词润饰的成员变量和办法都归于类,不归于某个目标;
- 一般变量和办法归于某个目标,每个目标都有自己的变量和办法,互相之间是阻隔的;
- 静态办法不能调用非静态的变量和非静态的办法,否则编译时就会报错。
4. 配套视频
与本节内容配套的视频链接如下:
player.bilibili.com/player.html…
二. 静态特点与静态常量
1. 概念
在Java类中,由static润饰的特点(成员变量)叫做静态变量,也叫类变量。而被static润饰的常量就叫做静态常量, 静态变量和静态常量统称为静态成员。留意,局部变量不能被声明为静态变量。
关于静态变量和静态常量来说, 不管一个类实例化出来多少个目标,它的静态成员都只有一份复制,能够被一切的目标同享 。
对实例变量来说,每个实例目标都有自己独立的变量,各个实例目标中的同名变量互不影响。可是关于静态变量来说,不管修正哪个实例目标的静态变量,作用其实都是相同的。也就是说,一切实例目标的静态变量都会被修正,原因在于静态变量并不归于某个单独的实例目标一切。
所以当咱们需求在多个目标之间进行信息同享的时分,就能够考虑运用静态变量或静态常量,增加实例之间的交互性。而假如类的一切实例目标都包括一个相同的常量特点,咱们就能够把这个特点界说为静态常量,以此节约内存空间。
能够说,实例成员在每个实例目标中都有自己的一个独立的私有“空间”,可是静态成员只有一个同享的公共“空间”,一切实例目标都会同享该静态成员。
2. 语法
关于静态变量或静态常量,咱们能够经过如下格局调用:
类名.变量名
类名.常量名
3. 静态变量与实例变量的差异
咱们现在现已知道什么是静态变量,什么是实例变量(成员变量)了,那么两者的差异有哪些呢?壹哥给咱们总结一下。
3.1 静态变量
- JVM虚拟机只会为静态变量分配一次内存,在加载类的过程中完成对静态变量的内存分配;
- 咱们能够在类的恣意办法中直接拜访恣意静态变量;
- 咱们能够在其他类中经过”类名.静态变量”的办法,来拜访该类中的静态变量。
3.2 实例变量
- 每创建一个Java实例目标,JVM虚拟机就会为该实例变量分配一次内存;
- 咱们能够在类的非静态办法中直接拜访实例变量;
- 在类的静态办法中,需求经过”目标.实例变量”的办法进行拜访。
4. 事例
4.1 界说静态特点和常量
咱们来界说一个Student类,在该类中界说如下几个成员变量、静态变量和静态常量。
/**
* @author 逐个哥Sun
* 千锋教育
*/
public class Student {
//成员变量
public String name;
//静态变量
public static String className;
//静态变量
public static int age;
//静态常量
public static final String SCHOOL_NAME="湘北中学";
//静态办法
public static void setAge(int age) {
//静态办法中不能运用this和super!
//this.age=age;
//能够经过“类名.静态成员”的办法来调用
Student.age=age;
//在本类中,咱们也能够直接在static办法中直接拜访原本中的静态成员
System.out.println("age="+age+",className="+className);
}
}
4.2 界说测验类
接下来咱们再来界说一个测验类,看看如何在代码中调用这些成员变量、静态变量等。关于静态变量和静态常量,咱们要经过 ”类名.静态成员“ 的办法进行调用,可是不主张经过“目标.静态变量”的办法来调用静态变量,尽管这样调用也不会报错!假如这样调用,会提示”静态特点应该经过静态办法来拜访,The static field Student.className should be accessed in a static way”。
/**
* @author 逐个哥Sun
* 千锋教育
*/
public class StaticTest {
public static void main(String[] args) {
Student stu01=new Student();
//调用成员变量
stu01.name="流川枫";
System.out.println("学生称号="+stu01.name);
Student stu02=new Student();
//调用成员变量
stu02.name="樱木花道";
System.out.println("学生称号="+stu02.name);
//调用静态变量
Student.className="高一.10班";
System.out.println("班级称号="+Student.className);
System.out.println("学校称号="+Student.SCHOOL_NAME);
//不主张经过“目标.静态变量”的办法来调用静态变量!静态特点应该经过静态办法来拜访!
//The static field Student.className should be accessed in a static way
//System.out.println("学生地点班级="+stu02.className);
}
}
从上述事例中,咱们能够总结出如下规则:
- 关于成员变量,要经过 “目标.变量名” 的办法调用;
- 成员变量归于某个目标 ,归于目标自己的 “私有财产” ,不能被整个类同享,目标之间不能同享这些成员变量;
- 静态变量和静态常量归于整个类 ,能够被类的一切目标同享,归于 “公共财产” ;
- 在同一个类中,咱们能够在静态办法中 直接调用静态成员 ,也能够经过 “类名.静态成员” ,或 “目标.静态成员” 的办法进行调用;
- 尽管语法支持经过“目标.静态变量”或“目标.静态常量”的办法进行调用,但不主张这样做;
- 关于静态成员,一般都是要经过 “类名.静态成员” 的办法调用,否则在编译时会有“静态特点应该经过静态办法来拜访”的提示;
5. 配套视频
与本节内容配套的视频链接如下:
player.bilibili.com/player.html…
三. 静态办法
1. 概念
被static润饰的办法叫做静态办法,也叫做类办法。 咱们经常在工具类中界说静态办法,比如常用的工具办法Arrays.sort()、Math.random()等。静态办法具有以下特性:
- 静态办法中只能调用静态成员和静态办法;
- 静态办法中不能运用this和super关键字;
- 笼统办法不能运用static进行润饰;
- 静态办法不能被重写,但能够被继承!
2. 语法
关于静态办法,咱们能够经过如下格局调用:
类名.办法名
3. 静态办法与实例办法的差异
接下来壹哥再给咱们总结一下静态办法与实例办法的差异。
- 静态办法能够直接经过“类名.办法名”的办法调用;
- 静态办法中不能运用this和super关键字;
- 静态办法中不能拜访非静态的成员;
- 实例办法中能够直接拜访所属类的静态变量、静态办法、实例变量和实例办法。
4. 事例
4.1 界说静态办法
咱们在静态办法中,只能调用静态的成员和静态的办法,不能调用非静态的!
/**
* @author 逐个哥Sun
* 千锋教育
*/
public class Student {
//静态变量
public static int age;
//静态办法---静态办法中只能调用静态成员和静态办法,不能调用非静态的!
public static void setAge(int age) {
//静态办法中不能运用this和super!
//this.age=age;
//能够经过“类名.静态成员”的办法来调用
Student.age=age;
System.out.println("age="+age);
}
}
4.2 调用静态办法
关于静态办法的调用,需求运用“类名.静态办法名”的格局。
/**
* @author 逐个哥Sun
* 千锋教育
*/
public class StaticTest {
public static void main(String[] args) {
//调用静态办法---类名.静态办法名
Student.setAge(100);
}
}
5. 配套视频
与本节内容配套的视频链接如下:
player.bilibili.com/player.html…
——————————正片已结束,来根过后烟—————————-
四. 结语
至此,壹哥就把static静态变量、静态常量、静态代码块、静态类、静态导入等相关的内容给咱们介绍结束了,这是咱们开发时很常用的内容,所以壹哥希望各位初学者,要把static相关的内容牢牢把握。最后简略总结一下本文关键:
- 静态变量、静态办法、静态常量统称为类的静态成员;
- 静态成员归整个类一切,不归于某个单一的目标,是 类 中的“公共财产”;
- 要弄清楚静态变量和实例变量的差异;
- 静态办法中不能运用this和super关键字;
- 静态办法中不能拜访非静态的成员。
另外假如你单独学习觉得有许多困难,能够加入壹哥的学习互助群,咱们一同交流学习。
五. 今天作业
1. 第一题
class MyClass{
static int a;
int b;
}
public class TestMain{
public static void main(Stringargs[]){
MyClass mc1=new MyClass();
mc1.a=100;
mc1.b=200;
MyClass mc2=new MyClass();
mc2.a=300;
mc2.b=400;
System.out.println(mc1.a);
System.out.println(mc1.b);
System.out.println(mc2.a);
System.out.println(mc2.b);
}
}
分析上述代码的执行结果,请在评论区给出你的答案。
本文正在参加「金石方案」