美文网首页
Java中的this、static关键字

Java中的this、static关键字

作者: 952625a28d0d | 来源:发表于2017-07-05 18:16 被阅读56次

    this 和 static关键字

    this

    package com.example;
    
    /**
     * Created by JiaYuanFa on 2017/7/5.
     */
    
    /*
    this: 是一个引用 他是当前类对象的引用
    Student stu = new Student()
    stu:可以使自定义的类的对象 也可以是其他类的对象
    this的应用:
    1:当我们方法参数和属性相同的时候 区分属性
    this.name = name
    2:对this的调用必须在构造方法的第一句
    3:在同一个类中调用其他构造方法
    this();调用当前类的无参数的构造方法
    this(参数);调用当前类的有参数的构造方法
     */
    
    public class This {
        int a;
        public static void main(String[] args) {
            This testOne = new This(); // 有名对象
    //        new PersonOne();    // 这个叫做匿名对象 没有自定义的引用
    
            // 当前类对象: 谁调用包含this的方法 this就是指的谁
            testOne.setA(4); // this指的就是 This类的对象 testOne
    
            This testTwo = new This();
            testTwo.setA(7);    // 此时的this指的就是 testTwo
    
            // this不能指向其他类
        }
    
        public void setA(int a) {
            this.a = a; // 这里的this 指的是当前类对象
        }
    }
    

    static

    package com.example;
    
    /**
     * Created by JiaYuanFa on 2017/7/5.
     */
    
    /*
    栈区
    公共区域:静态区域
    一:用在属性前面
    静态属性在内存中只有一个内存空间,与对象没有关系。而非静态属性与对象有关,每个对象都有自己的非静态属性的内存空间
    非静态属性必须通过new出新的对象才能使用
    但是静态属性可以通过类直接调用
    二:用在方法前面
    静态的不能调用非静态的
    三:静态块和普通块
    1:静态块只会执行一次,普通块(对象块)有多少个对象产生就会执行多少次
    2:静态块在普通块之前执行,也就是先执行静态块,后执行对象块,最后执行构造方法
    四:静态块有什么用?对象块有什么用?
    静态块底层块用的多,但是应用层用得少
    静态块用途?
    创建数据库 只要创建一次 可以使用
    只需要初始化一次的操作可以放在静态块中
    对象块用途?
    每个对象都要初始化的操作可以放在对象块中
     */
    
    public class C {
        int i;  // 非静态属性
        static int j;   // 静态属性 不会因为实例对象的初始化而改变值
    
        // 对象块
        {
            System.out.println("我的对象块");
        }
    
        // 静态块
        static {
            System.out.println("我的静态块");
        }
    
        public C() {
            System.out.println("对象出生了");
            i ++;
            j ++;
            System.out.println("i = " + i);
            System.out.println("j = " + C.j);   // 静态属性可以使用类名直接调用
        }
    
        public static void fun() {
            System.out.println("我的静态方法");
        }
        public void fun(int i) {
            System.out.println("我的非静态方法");
        }
    }
    

    实例验证:

    package com.example;
    
    /**
     * Created by JiaYuanFa on 2017/7/5.
     */
    
    public class Test_Static {
        public static void main(String[] args) {
            C c = new C(); // 首先去new C 中的静态变量 j 然后才会有对象 最后去栈区中创建引用c
            C c2 = new C(); // 初始化一个新的对象  和 上面的过程相似 ,但是呢 第二次去堆去创建静态变量j的时候,发现j已经存在了 只需要+1即可,但是呢,对象又产生了一个,引用的c也是又产生了一个
        }
    }
    
    image.png

    静态方法与非静态方法

    package com.example;
    
    /**
     * Created by JiaYuanFa on 2017/7/5.
     */
    
    /*
    静态方法不能调用非静态方法
    为什么呢?
    
    总结:
     */
    
    public class Student {
        int money;  // 属于个人的钱
        static int money2; // 属于班费
        // 普通的:个人消费----个人参与 个人有份
        public void xiaoFei(int money) {
            System.out.println("个人消费");
            // 个人消费 可以调用班级消费进行减法操作
            this.money -= money;
            money2 -= money;
        }
    
        // 静态的:所有人都有份的消费
        public static void classXiaofei(int money) {
            System.out.println("班级消费");
            // 但是班级消费 就不能调用个人消费了
            money2 -= money;
        }
    
        public static void main(String[] args) {
            /*
            静态方法是在new对象之前就被加载到类中的,而非静态方法是new出对象之后才被加载到内存中的
             */
    //        Student stu = new Student();
    //        Student.classXiaofei(); // 可以不要对象就直接调用 但是呢 对象方法就不行了
        }
    }
    

    使用Static实现单例模式

    package com.example;
    
    /**
     * Created by JiaYuanFa on 2017/7/5.
     */
    /*
    一个类默认情况下是可以new出无数个对象
    单例模式:一个类只能new出一个对象
     */
    public class Single {
    
        // 第一种写法:饿汉式写法
    //    private static Single sigle;
    //    public static Single getSingle() {
    //        if (sigle == null) {
    //            sigle = new Single();
    //        }
    //        return sigle;
    //    }
    
        // 第二种:懒汉式
        private static Single single = new Single();
        private Single() {};
        public static Single getSingle() {
            return single;
        }
    
        /*
        1:将构造方法私有 不可行
        1:声明一个静态的对象
        2:声明一个公有的方法
        3:判断对象是否存在 如果不存在生成此对象
        4:使用者通过该类提供的静态方法生成该对象即可
         */
        // 出生的行为是公有的 随时可以调用
    
        public static void main(String[] args) {
            Single singleOne = Single.getSingle();
            System.out.println(singleOne);
            Single singleTwo = Single.getSingle();
            System.out.println(singleTwo);
            Single singleThree = Single.getSingle();
            System.out.println(singleThree);
        }
    }
    
    
    image.png

    相关文章

      网友评论

          本文标题:Java中的this、static关键字

          本文链接:https://www.haomeiwen.com/subject/lrmqhxtx.html