Java基础突击第五天0009(代码块,构造方法私有化,内部类)

代码块分四种,普通(不用讨论),构造,静态,同步(多线程中讨论)

构造代码块是直接写在类中的代码块。构造代码块优先于构造方法执行,而且每次实例化对象都会执行构造代码块。

静态代码块优先于主方法执行,且优先于构造块执行。不管产生多少对象,静态代码块只执行一次。

经测试,构造代码块,静态代码块,构造方法的摆放顺序貌似无所谓的样子。谁在前面都没什么影响。

(复习:this()必须写在构造方法第一行)

public class TestJava{
}
class Person{
		{
			System.out.println("1.I am the constructor block!");
		}
		static{
			System.out.println("0.I am the static code blocK!");
		}
		public void tell(){
			System.out.println("Hello World");
		}
		public Person(){
			System.out.println("2.I am the constructor function!");
		}
}
class Demo{
	  public static void main(String[] args){
			new Person();
			new Person();
			}//main
}//Demo


封装性不止可以对属性进行封装,对方法也可以封装,比如构造方法。单例模式了解一下。可以限制对象的增加。想要几个对象就在类中实例化几个对象,传出去,而不是在外面实例化。

构造方法私有化以后,就不能在类外部进行实例化,否则会编译错误。

public class TestJava{
}
class Person{
	  private Person(){}  //
}
class Demo{
	  public static void main(String[] args){
			new Person();
		}
}//Demo
错误: Person() 在 Person 中是 private 访问控制

                        new Person();

public class TestJava{
}
class Person{
		public static int count = 0;
		static Person obj = new Person();
	  private Person(){
			count++;
			System.out.println(count+" objects has been generated!");
		}
		public void tell(){
			System.out.println("Hello World!");
		}
}
class Demo{
	  public static void main(String[] args){
			Person per = Person.obj;
			per.tell();
			Person per2 = Person.obj;
			per2.tell();
		}
}//Demo

输出:

1 objects has been generated!
Hello World!

Hello World!

不过上述程序本身也存在问题,类中属性必须封装,所以不能直接使用Person.obj,而应使用Person.getObj()方法来取得实例。不过Person.obj本身为静态static属性,所以调用它的方法也应为static属性。

public class TestJava{
}
class Person{
		public static int count = 0;
		private static Person obj = new Person();   //set private static
	  private Person(){
			count++;
			System.out.println(count+" objects has been generated!");
		}
		public static Person getObj(){              //set public  static
			return obj;
		}
		public void tell(){
			System.out.println("Hello World!");
		}
}
class Demo{
	  public static void main(String[] args){
			Person per = Person.getObj();
			per.tell();
			Person per2 = Person.getObj();
			per2.tell();
		}
}//Demo

构造方法私有化的意义在于,无论声明了多少个对象,实际上所有的对象都是对obj的引用。最终结果也只有一个实例化对象存在。用windows来举例的话,可以看到C,D,E,F盘,每个盘都有个回收站标识,其实这几个都是对系统回收站的引用,实际存在的回收站全系统只有一个。只需将构造方法私有化,就能控制实例化对象的产生。

对象数组可以参考String类型,String[] args实际上就是对象数组。

Person[] per = {new Person("FangXy"),new Person("FuXs"),new Person("FangZw")};

或者

Person[] per = new Person[3];

per[0] = new Person("FangXy");

per[1] = new Person("FuXs");

per[2] = new Person("FangZw");

对象数组的属性遍历输出:

public class TestJava{
}
class Person{
		private String name;
		public Person(String name){
			this.name = name;
		}
		public String getName(){
			return this.name;
		}
		public void tell(){
			System.out.println("Name is : "+this.getName());
		}
}
class Demo{
	  public static void main(String[] args){
			Person[] per = new Person[3];
			per[0] = new Person("FangXy");
			per[1] = new Person("FuXs");
			per[2] = new Person("FangZw");
			for(Person p:per){
				System.out.print(p.getName()+" ");
			}
			System.out.println();
		}
}//Demo

输出:FangXy FuXs FangZw



猜你喜欢

转载自blog.csdn.net/u012144068/article/details/80921040