• java学习中,static 修饰符使用、static方法、静态代码块、主函数为何如此写、单例设计模式(java 学习中的小记录)


    java学习中,static 修饰符使用、static方法、静态代码块、主函数为何如此写、单例设计模式(java 学习中的小记录)

    作者:王可利(Star·星星)

    static (静态修饰符)

    1.用来修饰成员变量

        成员变量被static修饰 就叫静态成员变量,如果没有修饰叫非静态成员变量。

         静态成员变量的访问方式:

                1.用对象进行访问,直接点语法拿到。如:对象名.变量名

                2.通过类名来直接访问。 如:类名.变量名

          注意:不要认为方便把所有的变量都用static修饰,只有当数据真正需要共享是才需要用static修饰。

                   只有静态变量才能用类来访问,非静态变量只能用对象来访问,类是不能访问的。

    静态变量和非静态变量的区别:

        1.作用上来看:

            a.静态变量是用来共享的,所有的对象都可以访问到

            b.非静态变量就是用来描述同一类事物的公共属性。

        2.数量和存储的位置上:

            a.静态变量存在静态方法区(数据共享区),并且只有一份数据。

            b.非静态变量存在堆区中,对象有N个,数据就有N个。

        3.生命周期:

            a.静态变量是在随着类文件的加载而加载,随着类文件消失而消失。

            b.非静态变量是随着对象创建而创建,随着对象的消失而消失。

    2.修饰方法 

        static 修饰的方法和OC中的类方法有点相似,OC中类方法只能用类名来调用,类是不允许访问属性的。

         而java中static修饰的方法是可以用对象名来调用的,也可以用类名来调用,不过推荐使用类名调用。(这样的话就可以知道是直接知道是静态方法)。

         如: public static void study(){

                         静态方法

                }

          调用:类名.方法名();  /  对象名.方法名();

          结构上就是在普通方法 public 后面多加了一个static,用static修饰的方法是静态方法,不叫类方法。

         static 修饰的方法使用需要注意的点:

         1.静态方法可以用对象和类名调用。非静态方法只能用对象来调用。

         2.静态方法是可以访问静态成员变量的,但是不能够访问非静态的成员变量。非静态方法可以访问任何的成员变量。

            原因:有可能静态方法被调用了,但是对象还没有被创建出来,自然就没有成员变量。

         3.静态方法中可以直接访问静态方法,但是不能访问非静态方法。非静态方法是可以访问静态方法。

            原因:有可能静态方法被调用了,但是对象还没有被创建出来,又因为非静态方法只能由对象来调用,所以调用不了。

                      如果对象被创建出来,静态方法早就存在内存中了。

         4.静态方法中是不允许出现this关键字 或者 super关键字的。

            this:表示一个方法调用者对象。

    特点:静态的数据在就存在于非静态的数据存在内存中。

    什么时候使用static来修饰方法?

         当一个方法不需要直接访问非静态数据,这个时候就可以用static来修饰(定于工具类 如:arrays)

    静态代码块

    大括号{}前面加一个static就是静态代码块。

    格式:

         static{

       

         }

    编译java.class文件被使用的时候就执行了。使用到这个类的时候就使用了。

    权限修饰符:

    1.public :公共的,公开的,权限是最大的,在任何的情况下都可以调用。

    2.private:私有的,权限是最小的,只能自己本类中访问。

    3.protected:受保护的。

    主函数为什么要这样来定义?

    public static void main(String[] args){}

    1.为什么使用 public:

        main 主方法是由jvm(java虚拟机)来调用的,jvm实际也是一个程序,所以是为了保证jvm能够在任何情况下来调用主函数。

    2.为什么使用 static:

        如果没有static 这个时候调用主方法就需要通过对象来调用,jvm如果创建对象不知道该传递什么参数(如:构造方法有无参的,或者N个参数的),所以为了避免麻烦,就将方法定义成了静态的方法,这个时候就不需要考虑对象了,直接用类名就可以调用。

    3.为什么返回值是void :

        main 是由jvm调用,返回值是给jvm ,jvm接收返回值是没有任何意义的,所以就不需要返回值。

    4. main:

        main 不是一个关键字,没有特别的含义,因为很多语言都以main 作为函数的入口,所以main 已经约定好了的,这个就叫入口。

    5.args:

       用来接收程序运行的时候传进来的参数。

        如:额外知识:

        Object-c 中遍历数组有一个是 for in 的方法,在java中 for循环增强是 foreach 方法,括号里面用的是 冒号 :不是分号;

        代码如下:

     1 public class Star_static {
     2 
     3     public static void main(String[] args) {
     4         
     5         //增强for循环, java 叫 foreach循环 这里args传的就是一个参数。
     6         for(String s : args){
     7             System.out.println(s);
     8         }
     9     }
    10 } 

    可以这样在Demo6 后面写参数,控制台传递参数,不过这样不方便,一般使用 Scanner会比较多。这个用的比较少。

    单例设计模式

    单例设计模式:一个类只能够创建一个对象出来,不管在哪里使用都是这个类。

    软件行业中设计模式大概有23种:

    可能在java学习中会讲到下面的设计模式:

    1.单例设计模式

    2.观察者设计模式

    3.模块设计模式(mvc)

    4.装饰设计模式

    5.工厂设计模式

    设计模式:用来解决同一个问题的解决方案。

    如何实现单例设计模式?(目的:阻止别人用new来多次创建对象)

    详见一下代码注释分析:

     1 class  SingleDog{
     2     
     3     String name;
     4     
     5     //阻止让别人用 new 来对次创建对象 (保证对象唯一)
     6     //private 私有方法只能在本类使用,如果使用public的话,外面的类就可以通过点语法拿到然后创建多个,就不唯一了。这样就相当于是成员变量了。
     7     private static SingleDog s = new SingleDog();
     8     
     9     //私有化构造方法,防止通过new来创建对象
    10     private SingleDog(){}
    11     
    12     //提供一个静态的方法(不用创建对象就可以调用)来接收唯一的对象
    13     public static SingleDog getInstance(){
    14         return s;//返回之前new的那个对象
    15     }
    16 }
    17 
    18 public class Star_dlsjmm {
    19 
    20     public static void main(String[] args) {
    21         SingleDog star1 = SingleDog.getInstance();//调用类中无参数的构造方法
    22         star1.name = "星星";
    23         SingleDog star2 = SingleDog.getInstance();
    24         SingleDog star3 = SingleDog.getInstance();    
    25         //如果打印的结果 star2 ,star3    不是空的 就是单例了
    26         System.out.println(star1.name);
    27         System.out.println(star2.name);
    28         System.out.println(star3.name);
    29     }
    30 }

    经过测试发现,单例设计模式是成功的。打印的三个对象都一样,没有出现null。

    总结:

        饿汉单例设计模式:

          步骤:

             1.定义一个私有的静态成员变量来引用对象(私有的静态对象),设置对象唯一。

             2.私有化构造方法,防止new对象。

             3.创建一个公开的静态方法,返回上面的对象。

        懒汉单例设计模式(要用的时候才创建对象):

          步骤:

              1.定于一个私有的静态成员变量,不要赋值。

              2.私有化构造方法,防止new对象。

              3.创建一个公开的静态方法,判断是否存在对象,如果不存在就创建一个,如果存在就直接返回。

  • 相关阅读:
    面向对象 小游戏 打飞机
    面向对象2
    面向对象
    正则 校验邮箱
    正则 过滤敏感字
    Strobogrammatic Number
    Binary Tree Right Side View
    [?]*Closest Binary Search Tree Value II
    *Closest Binary Search Tree Value
    *Inorder Successor in BST
  • 原文地址:https://www.cnblogs.com/StarKL/p/6118495.html
Copyright © 2020-2023  润新知