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也是又产生了一个
}
}

静态方法与非静态方法
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);
}
}

网友评论