代码块分四种,普通(不用讨论),构造,静态,同步(多线程中讨论)
构造代码块是直接写在类中的代码块。构造代码块优先于构造方法执行,而且每次实例化对象都会执行构造代码块。
静态代码块优先于主方法执行,且优先于构造块执行。不管产生多少对象,静态代码块只执行一次。
经测试,构造代码块,静态代码块,构造方法的摆放顺序貌似无所谓的样子。谁在前面都没什么影响。
(复习: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