Static关键字

83 阅读7分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解Static关键字,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

Static关键字

 /*
     static:
         1、static翻译为“静态”
         2、所有static关键字修饰的都是类相关的,类级别的。
         3、所有static修饰的,都是采用“类名.”的方式访问。
         4、static修饰的变量:静态变量
         5、static修饰的方法:静态方法
     
     变量的分类:
         变量根据声明的位置进行划分:
             在方法体当中声明的变量叫做:局部变量。
             在方法体外声明的变量叫做:成员变量。
         
         成员变量又可以分为:
             实例变量
             静态变量
 */
 ​
 class VarTest{
 ​
     // 以下实例的,都是对象相关的,访问时采用“引用.”的方式访问。需要先new对象。
     // 实例相关的,必须先有对象,才能访问,可能会出现空指针异常。
     // 成员变量中的实例变量
     int i;
 ​
     // 实例方法
     public void m2(){
         // 局部变量
         int x = 200;
     }
 ​
 ​
     // 以下静态的,都是类相关的,访问时采用“类名.”的方式访问。不需要new对象。
     // 不需要对象的参与即可访问。没有空指针异常的发生。
     // 成员变量中的静态变量
     static int k;
 ​
     // 静态方法
     public static void m1(){
         // 局部变量
         int m = 100;
     }
     
 }
static的使用条件
 /*
     什么时候变量声明为实例的,什么时候声明为静态的?
         如果这个类型的所有对象的某个属性值都是一样的,
         不建议定义为实例变量,浪费内存空间。建议定义
         为类级别特征,定义为静态变量,在方法区中只保留
         一份,节省内存开销。
     
     一个对象一份的是实例变量。
     所有对象一份的是静态变量。
 */
 /*
 public class StaticTest02{
     public static void main(String[] args){
         Chinese c1 = new Chinese("1231456456456456","张三","中国");
         System.out.println(c1.idCard);
         System.out.println(c1.name);
         System.out.println(c1.country);
 ​
         Chinese c2 = new Chinese("7897897896748564","李四","中国");
         System.out.println(c2.idCard);
         System.out.println(c2.name);
         System.out.println(c2.country);
     }
 }
 ​
 // 定义一个类:中国人
 class Chinese{
 ​
     // 身份证号
     // 每一个人的身份证号不同,所以身份证号应该是实例变量,一个对象一份。
     String idCard; 
 ​
     // 姓名
     // 姓名也是一个人一个姓名,姓名也应该是实例变量。
     String name;
 ​
     // 国籍
     // 对于“中国人”这个类来说,国籍都是“中国”,不会随着对象的改变而改变。
     // 显然国籍并不是对象级别的特征。
     // 国籍属于整个类的特征。整个族的特征。
     // 假设声明为实例变量,内存图是怎样的?
     // 假设声明为静态变量,内存图又是怎样的?
     String country;
 ​
     // 无参数
     public Chinese(){
     
     }
 ​
     // 有参数
     public Chinese(String s1,String s2, String s3){
         idCard = s1;
         name = s2;
         country = s3;
     }
 }
 */
 ​
 public class StaticTest02{
     public static void main(String[] args){
         // 访问中国人的国籍
         // 静态变量应该使用类名.的方式访问
         System.out.println(Chinese.country);
 ​
         Chinese c1 = new Chinese("1231456456456456","张三");
         System.out.println(c1.idCard);
         System.out.println(c1.name);
 ​
         Chinese c2 = new Chinese("7897897896748564","李四");
         System.out.println(c2.idCard);
         System.out.println(c2.name);
 ​
         // idCard是实例变量,必须先new对象,通过“引用.” 访问
         // 错误: 无法从静态上下文中引用非静态 变量 idCard
         //System.out.println(Chinese.idCard);
     }
 }
 ​
 // 定义一个类:中国人
 class Chinese{
 ​
     // 身份证号
     // 每一个人的身份证号不同,所以身份证号应该是实例变量,一个对象一份。
     String idCard; 
 ​
     // 姓名
     // 姓名也是一个人一个姓名,姓名也应该是实例变量。
     String name;
 ​
     // 国籍
     // 重点重点五颗星:加static的变量叫做静态变量
     // 静态变量在类加载时初始化,不需要new对象,静态变量的空间就开出来了。
     // 静态变量存储在方法区。
     static String country = "中国";
 ​
     // 无参数
     public Chinese(){
     
     }
 ​
     // 有参数
     public Chinese(String s1,String s2){
         idCard = s1;
         name = s2;
     }
 }
static方法的调用
 //带有static的方法
 //没有static的方法
 //分别怎么调用?
     //带有static的方法怎么调用?通过“类名.”的方式访问。
 ​
 //对象被称为实例。
 //实例相关的有:实例变量、实例方法。
 //实例变量是对象变量。实例方法是对象方法。
 //实例相关的都需要先new对象,通过“引用.”的方式去访问。
 public class MethodTest{
 ​
     /*
     public MethodTest(){
     
     }
     */
 ​
     public static void main(String[] args){
         MethodTest.doSome();
         //类名. 可以省略(在同一个类中。)
         doSome();
         // 尝试使用“类名.”的方式访问“实例方法”
         // 错误的
         //MethodTest.doOther();
         
         // 创建对象
         MethodTest mt = new MethodTest();
         // 通过"引用."的方式访问实例方法。
         mt.doOther();
 ​
     }   
 ​
     // 带有static
     public static void doSome(){
         System.out.println("do some!");
     }
 ​
     //这个方法没有static,这样的方法被称为:实例方法。(对象方法,对象级别的方法)
     //这个没法解释,大家目前死记硬背。
     public void doOther(){
         System.out.println("do other....");
     }
 ​
 }
空指针与static
 ​
 /*
     实例的:一定需要使用“引用.”来访问。
 ​
     静态的:
         建议使用“类名.”来访问,但使用“引用.”也行(不建议使用"引用.")。
         静态的如果使用“引用.”来访问会让程序员产生困惑:程序员以为是实例的呢。
     
     结论:
         空指针异常只有在什么情况下才会发生呢?
             只有在“空引用”访问“实例”相关的,都会出现空指针异常。
 */
 public class StaticTest03{
     public static void main(String[] args){
         // 通过"类名."的方式访问静态变量
         System.out.println(Chinese.country);
         // 创建对象
         Chinese c1 = new Chinese("1111111", "张三");
         System.out.println(c1.idCard); // 1111111
         System.out.println(c1.name); // 张三
         System.out.println(c1.country); // 中国
 ​
         // c1是空引用
         c1 = null;
         // 分析这里会不会出现空指针异常?
         // 不会出现空指针异常。
         // 因为静态变量不需要对象的存在。
         // 实际上以下的代码在运行的时候,还是:System.out.println(Chinese.country);
         System.out.println(c1.country);
 ​
         // 这个会出现空指针异常,因为name是实例变量。
         //System.out.println(c1.name);
     }
 }
 ​
 class Chinese{
 ​
     // 实例变量
     String idCard;
     String name;
 ​
     // 静态变量
     static String country = "中国";
 ​
     //构造方法
     public Chinese(String x, String y){
         idCard = x;
         name = y;
     }
 }

栗子

 ​
 public class StaticTest04{
     public static void main(String[] args){
 ​
         // 这是比较正规的方式,静态方法采用“类名.”
         StaticTest04.doSome();
 ​
         //对象
         StaticTest04 st = new StaticTest04();
         // 用“引用.”访问
         st.doSome();
 ​
         // 空引用
         st = null;
         // 不会出现空指针异常
         st.doSome(); // 这个代码在最终执行的时候还是会转变为:StaticTest04.doSome();
 ​
         // 实例方法doOther()
         // 对象级别的方法(先new对象,通过“引用.”来访问)
         //错误: 无法从静态上下文中引用非静态 方法 doOther()
         //StaticTest04.doOther();
 ​
         StaticTest04 st2 = new StaticTest04();
         st2.doOther();
 ​
         // 空引用
         st2 = null;
         // 空引用调用实例方法会出现什么问题?空指针异常。
         //st2.doOther();
 ​
     }
 ​
     // 静态方法(静态方法不需要new对象,直接使用“类名.”来访问)
     // 但是也可以使用“引用.”来访问,不建议用。(因为其他程序员会感到困惑。)
     public static void doSome(){
         System.out.println("静态方法doSome()执行了!");
     }
 ​
     // 实例方法(实例相关的都需要new对象,使用"引用."来访问。)
     public void doOther(){
         System.out.println("实例方法doOther执行了!");
     }
 }
 ​
 // 从第一天开始讲解HelloWorld到目前为止,一个类当中一共就写过这些东西。
 /*
 类{
     // 实例相关的都是需要new对象的,通过"引用."访问。
     实例变量;
     实例方法;
 ​
     // 静态相关的都是采用“类名.”访问。也可以使用“引用.”,只不过不建议。
     静态变量;
     静态方法;
 }
 */