java学习之路 之 高级类特性2-关键字static、类变量、类方法、单例模式

关键字:static  类变量、类方法单例(Singleton)设计模式

关键字static:

使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类
被修饰后的成员具备以下特点:
随着类的加载而加载
优先于对象存在
修饰的成员,被所有对象所共享访问
权限允许时,可不创建对象,直接被类调用

类属性、类方法的设计思想:

类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用

类变量(class Variable):由该类的所有实例共享

类变量应用举例:

class Person {           
	private int id;           
	public static int total = 0;           
	public Person() { 	         
		total++; 	         
		id = total;           
	}           
	public static void main(String args[]){         	
		Person Tom=new Person();	
		Tom.id=0;	
		total=100; // 不用创建对象就可以访问静态成员         
	} 
}

public class OtherClass {            
	public static void main(String args[]) { 	         
		Person.total = 100;  // 不用创建对象就可以访问静态成员   访问方式:类名.类属性,类名.类方法	        
		System.out.println(Person.total);	         
		Person c = new Person(); 	         
		System.out.println(c.total);	//输出101            
	}
}


类方法(class Method) :

没有对象的实例时,可以用类名.方法名()的形式访问由static标记的类方法。

在static方法内部只能访问类的static属性,不能访问类的非static属性。

class Person {       
	private int id;       
	private static int total = 0;       
	public static int getTotalPerson() { 	
		//id++;	//非法	
		return total;       
	}       
	public Person() {         	
		total++; 	
		id = total;       
	}
}
public class TestPerson {        
	public static void main(String[] args) { 	
		System.out.println("Number of total is " +Person.getTotalPerson());	//没有创建对象也可以访问静态方法 	
		Person p1 = new Person();     	
		System.out.println( "Number of total is "+ p1.getTotalPerson());        
	}
}	

输出结果:
Number of total is 0
Number of total is 1
因为不需要实例就可以访问static方法,因此static方法内部不能有this和super。
重载的方法需要同时为static的或者非static的。

单例 (Singleton)设计模式:

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,
免去我们自己再思考和摸索。        
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

单例(Singleton)设计模式-饿汉式:

// 饿汉式单例, 声明引用同时创建对象
	class Singleton1 { // 单例 : 在程序运行期间只允许有一个对象
		// 1) 私有化构造器, 防止外部随意创建对象
		private Singleton1() {}
	
		// 2) 在类内部声明私有的静态引用变量, 并创建唯一的对象, 赋值于这个引用
		private static Singleton1 only = new Singleton1();
	
		// 3) 提供公共静态方法用以获取类中唯一的对象
		public static Singleton1 getInstance() {
			return only;
		}
	}
	// 懒汉式, 第一次获取对象时才创建对象
	class Singleton2 {
	
		// 1) 私有化构造器
		private Singleton2() {}
	
		// 2) 在类内部声明私有的静态引用变量
		private static Singleton2 only;
	
		// 3) 提供公共的静态方法用以获取类中的唯一的对象
		public static Singleton2 getInstance() {
			if (only == null) {
				only = new Singleton2();
			}
			return only;
		}
	}	
	class Singleton1Test {
	
		public static void main(String[] args) {
			//Singleton1 s1 = new Singleton1(); 构造器私有化后就不可以创建对象
			//Singleton1 s2 = new Singleton1();
			Singleton1 s1 = Singleton1.getInstance(); // 通过方法获取对象 
			Singleton1 s2 = Singleton1.getInstance();
			System.out.println(s1 == s2);
		}
	}

  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值