Java中的this、static关键字

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也是又产生了一个
    }
}
Java中的this、static关键字_第1张图片
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);
    }
}

Java中的this、static关键字_第2张图片
image.png

你可能感兴趣的:(Java中的this、static关键字)