Java基础教程-static关键字

观看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指针的对象固定了,所以只能修改对象内部的值,不能指向一个新的对象(内存空间)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隐藏用户y

虽然不是很有才华,但是渴望打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值