观看mooc的教程,手敲笔记记录一下
一.static关键字
java中的static关键字可以作用在
- 变量
- 方法
- 类
- 匿名方法块
public class Potato {
static int price = 5;
String content = "";
public Potato(int price, String content)
{
this.price = price;
this.content = content;
}
public static void main(String[] a)
{
System.out.println(Potato.price); //Potato.content wrong
System.out.println("----------------------------------");
Potato obj1 = new Potato(10,"青椒土豆丝");
System.out.println(Potato.price);
System.out.println(obj1.price);
System.out.println("----------------------------------");
Potato obj2 = new Potato(20,"酸辣土豆丝");
System.out.println(Potato.price);
System.out.println(obj2.price);
}
}
System.out.println(Potato.price)不能是System.out.println(Potato.content),因为content不是静态变量,不能依赖于类存在。
static方法:
- 静态方法无需通过对象来引用,而是直接通过类名引用
- 在静态方法中,只能使用静态变量,不能使用非静态变量。
- 静态方法禁止引用非静态方法,非静态方法可以调用静态方法。(如下代码)
public class StaticMethodTest {
int a = 111111;
static int b = 222222;
public static void hello()
{
System.out.println("000000");
System.out.println(b);
//System.out.println(a); //error, cannot call non-static variables
//hi() //error, cannot call non-static method
}
public void hi()
{
System.out.println("333333");
hello(); //ok, call static methods
System.out.println(a); //ok, call non-static variables
System.out.println(b); //ok, call static variables
}
public static void main(String[] a)
{
StaticMethodTest.hello();
//StaticMethodTest.hi(); //error, 不能使用类名来引用非静态方法
StaticMethodTest foo = new StaticMethodTest();
foo.hello(); //warning, but it is ok
foo.hi(); //right
}
}
static块
- 只在类第一次被加载时调用。
- 程序运行期间代码只运行一次。
- 执行顺序:static块>匿名块>构造函数
注意:不建议编写代码块,代码块会给程序带来混淆,推荐将块代码封装成函数之后调用
可以写成初始化的名字init(),initial(),再在构造函数里面调用
class StaticBlock
{
//staticl block > anonymous block > constructor function
//静态代码块
static
{
System.out.println("22222222222222222222");
}
//匿名代码块
{
System.out.println("11111111111111111111");
}
//构造函数
public StaticBlock( )
{
System.out.println("33333333333333333333");
}
//匿名代码块
{
System.out.println("44444444444444444444");
}
}
new的时候只有static块不会被运行
二.单例模式
static作用于变量时,该变量在内存只有一个拷贝
单例模式又称单态模式:保证一个类有且仅有一个对象
(限制某一个类在整个程序运行过程中,只能保存一个实例对象在内存中)
采用static来共享对象实例
采用private构造函数,防止外界new操作
class ZhangSan()
{
private Beauty() {
//本构造函数私有
};
};
Beauty xiaosan=new Beauty();//无法创建,因为构造函数是私有的
public class Singleton {
private static Singleton obj = new Singleton(); //共享同一个对象
private String content;
private Singleton() //确保只能在类内部调用构造函数
{
this.content = "abc";
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public static Singleton getInstance() {
//静态方法使用静态变量
//另外可以使用方法内的临时变量,但是不能引用非静态的成员变量
return obj;
}
public static void main(String[] args) {
Singleton obj1 = Singleton.getInstance();
System.out.println(obj1.getContent()); //abc
Singleton obj2 = Singleton.getInstance();
System.out.println(obj2.getContent()); //abc
obj2.setContent("def");
System.out.println(obj1.getContent());
System.out.println(obj2.getContent());
System.out.println(obj1 == obj2); //true, obj1和obj2指向同一个对象
}
}
三.final关键字
java中的final关键字同样可以用来修饰
- 类
- 方法
- 字段
final类不能被继承
父类中如果又final方法,子类不可以修改此方法
final的变量,不能再次赋值,如果是基本型别的变量,不能修改其值
如果是对象实例,不能修改其指针(但是可以修改对象内部的值)
class FinalObject
{
int a = 10;
}
public class FinalObjectTest {
public static void main(String[] args) {
final FinalObject obj1 = new FinalObject();
System.out.println(obj1.a);
obj1.a = 20;
System.out.println(obj1.a);
obj1 = new FinalObject();
//final对象不能变更指针
}
}
final指针的对象固定了,所以只能修改对象内部的值,不能指向一个新的对象(内存空间)