天天看點

Java學習筆記13(了解初始化塊和abstract)初始化塊關鍵字final抽象類模闆方法設計模式(TemplateMethod)

文章目錄

  • 初始化塊
    • 非靜态代碼塊:沒有static修飾的代碼塊
    • 靜态代碼塊:用static 修飾的代碼塊
    • 匿名類(靜态代碼塊的作用)
  • 關鍵字final
  • 抽象類
  • 模闆方法設計模式(TemplateMethod)

初始化塊

代碼塊:

{

xxxx

}

初始化塊是對構造器的補充,不能接受任何參數,用于定義類執行個體化生成的所有對象共有的屬性,方法和内容

非靜态代碼塊:沒有static修飾的代碼塊

1.可以有輸出語句。
   2.可以對類的屬性聲明進行初始化操作。
   3.可以調用靜态和非靜态的變量或方法。
   4.若有多個非靜态的代碼塊,那麼按照從上到下的順序依
       次執行。
   5.每次建立對象的時候,都會執行一次。且先于構造器執行
           
public class Person {
	String name;
	//構造方法
	public Person(){
		this.name = "liming";
		System.out.println("執行的構造方法");
	} 
	
	//非靜态代碼塊
	{
		System.out.println("執行的非靜态代碼塊");
	}
	
	public static void main(String[] args) {
		new Person();
	}

}
           

列印結果:

執行的非靜态代碼塊
執行的構造方法
           

執行順序:

1 類的屬性預設初始化

2 執行的非靜态代碼塊

3 執行的構造方法

public static void showAge(){
		System.out.println(age);
	}
	
	
	static int age = 18;
	//靜态代碼塊
	static{
		//這裡隻能使用靜态static修飾的屬性和方法
		age = 1;
		showAge();
		System.out.println("執行的靜态代碼塊");
	}//習慣把屬性放在後面,代碼塊寫在前面
           

靜态代碼塊隻執行一次。

public class Person {
	String name;
	static int age;
	public Person(){
		this.name = "liming";
		System.out.println("執行的構造方法");
	} 
	
	//非靜态代碼塊
	{
		System.out.println("執行的非靜态代碼塊");
	}
	
	public static void showAge(){
		System.out.println(age);
	}
	
	//靜态代碼塊
	static{
		//這裡隻能使用靜态static修飾的屬性和方法
		age = 18;
		showAge();
		System.out.println("執行的靜态代碼塊");
	}
	
	
	public static void main(String[] args) {
		new Person();
		new Person();
	}

}
           
Java學習筆記13(了解初始化塊和abstract)初始化塊關鍵字final抽象類模闆方法設計模式(TemplateMethod)

發現:

靜态代碼塊隻執行一次

非靜态代碼塊,每次new對象的時候重複執行。

靜态代碼塊:用static 修飾的代碼塊

1.可以有輸出語句。
 2.可以對類的屬性聲明進行初始化操作。
 3.不可以對非靜态的屬性初始化。即:不可以調用非靜态的屬
     性和方法。
4.若有多個靜态的代碼塊,那麼按照從上到下的順序依次執行。
5.靜态代碼塊的執行要先于非靜态代碼塊。
6.靜态代碼塊隻執行一次
           

在實際開發中,靜态代碼塊用的會多一些

這有什麼用?

static int age=18;不就可以了嗎?,為什麼要在靜态代碼塊裡面指派?

因為age 是簡單的屬性,換一個例子看

新加一個test方法,建立一個匿名類,alt+/ ,方法的重寫。

Java學習筆記13(了解初始化塊和abstract)初始化塊關鍵字final抽象類模闆方法設計模式(TemplateMethod)
Java學習筆記13(了解初始化塊和abstract)初始化塊關鍵字final抽象類模闆方法設計模式(TemplateMethod)

這個是匿名類,不能new,沒有構造器,是以在靜态代碼塊内初始化!

匿名類(靜态代碼塊的作用)

讀代碼:看注釋!

public class Person {
	String name;
	static int age;
	public Person(){
		this.name = "liming";
		System.out.println("執行的構造方法");
	} 
	
	//非靜态代碼塊
	{
		System.out.println("執行的非靜态代碼塊");
	}
	
	public static void showAge(){
		System.out.println(age);
	}
	
	//靜态代碼塊
	static{
		//這裡隻能使用靜态static修飾的屬性和方法
		age = 18;
		showAge();
		System.out.println("執行的靜态代碼塊");
	}
	
	public void test() {
		System.out.println("這是person裡的test方法");
	}
	
	public static void main(String[] args) {
//		new Person();
//		new Person();
		
		//沒有名稱的person的子類。沒有類名,就不能構造方法
		Person p = new Person() {
			{
				//用代碼塊代替構造方法
				super.name = "javer";
			}
			@Override
			public void test() {
				// TODO Auto-generated method stub
				System.out.println("========");
			}
		};
		System.out.println(p.name);
		p.test();//執行的是重寫的方法
	}

}
           

關鍵字final

final是太監,不能繼承。

final

final标記的類不能被繼承。提高安全性,提高程式的可讀性。

String類、System類、StringBuffer類

final标記的方法不能被子類重寫。

final标記的變量(成員變量或局部變量)即稱為常量。名稱大寫,且隻能被指派一次。

static final:全局常量

抽象類

用abstract關鍵字來修飾一個類時,這個類叫做抽象類;

用abstract來修飾一個方法時,該方法叫做抽象方法。

Java學習筆記13(了解初始化塊和abstract)初始化塊關鍵字final抽象類模闆方法設計模式(TemplateMethod)

抽象類不能被執行個體化。抽象類是用來作為父類被繼承的,抽象類的子類必須重寫父類的抽象方法,并提供方法體。

Java學習筆記13(了解初始化塊和abstract)初始化塊關鍵字final抽象類模闆方法設計模式(TemplateMethod)

抽象類一定要有抽象方法,或者提供方法體(不是抽象方法了)

不能用abstract修飾屬性、私有方法、構造器、靜态方法、final的方法。

含有抽象方法的類必須被聲明為抽象類。

Java學習筆記13(了解初始化塊和abstract)初始化塊關鍵字final抽象類模闆方法設計模式(TemplateMethod)

代碼沒有報錯,但是不能運作?debug發現main方法寫錯位置了

源代碼:

public abstract class Animal {
	public abstract void test();
	public abstract void move();

	public static void main(String[] args) {
		Dog d = new Dog();
		d.move();
	}
	
	
}

class Dog extends Animal{
	@Override
	public void test() {
		// TODO Auto-generated method stub
		System.out.println("===");
	}
	@Override
	public void move() {
		// TODO Auto-generated method stub
		System.out.println("run");
	}
}
           

也可以建立一個Test.java,用來調用main方法。

練習:

編寫一個Employee類,聲明為抽象類,包含如下三個屬性:name,id,salary。提供必要的構造器和抽象方法:work()。對于Manager類來說,他既是員工,還具有獎金(bonus)的屬性。請使用繼承的思想,設計CommonEmployee類和Manager類,要求類中提供必要的方法進行屬性通路。

源代碼:

/**
 * 編寫一個Employee類,聲明為抽象類,
 * 包含如下三個屬性:name,id,salary。
 * 提供必要的構造器和抽象方法:work()。
 * 對于Manager類來說,他既是員工,還具有獎金(bonus)的屬性。
 * 請使用繼承的思想,設計CommonEmployee類和Manager類,
 * 要求類中提供必要的方法進行屬性通路。
 * @author jkjkjk
 *
 */
public abstract class Employee {
	public Employee(){
		
	}
	
	int id;
	String name;
	double salary;
	
	//抽象方法work
	public abstract void work();
}

//子類CommonEmployee
class CommonEmployee extends Employee{
	/**
	 * set,get 方法進行屬性通路。
	 * @param id
	 * @param name
	 * @param salary
	 */
	public void setCommonEmployee(int id, String name,double salary) {
		//父類的用super
		super.id = id;
		super.name = name;
		super.salary = salary;
	}
	
	public void getCommonEmployee() {
		System.out.println("這是一個普通員工編号"+super.id);
		System.out.println("這是一個普通員工姓名"+super.name);
		System.out.println("這是一個普通員工月薪"+super.salary);
	}
	
	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("這是父類抽象方法的重寫");
	}
}

//子類,manage
class Manage extends Employee{
	double bonus;//子類的成員變量
	
	public void setManage(int id, String name,double salary,double bonus) {
		super.id = id;
		super.name = name;
		super.salary = salary;
		this.bonus = bonus;//本類用this
	}
	
	public void getManage() {
		System.out.println("這是一個普通員工編号"+super.id);
		System.out.println("這是一個普通員工姓名"+super.name);
		System.out.println("這是一個普通員工月薪"+super.salary);
		System.out.println("這是一個普通員工獎金"+this.bonus);
	}
	@Override
	public void work() {
		// TODO Auto-generated method stub
		
	}
}
           
/**
 * 執行個體化employee
 * @author jkjkjk
 *
 */
public class TestPerson {
	public static void main(String[] args) {
		CommonEmployee ce = new CommonEmployee();
		ce.work();
		ce.setCommonEmployee(007, "liming", 25000);//要求類中提供必要的方法進行屬性通路。
		ce.getCommonEmployee();
	}

}
           

模闆方法設計模式(TemplateMethod)

抽象類作為多個子類的通用模闆,子類在抽象類的基礎上進行擴充、改造,但子類總體上會保留抽象類的行為方式。

抽象類是一個大綱,抽象方法就算章節,子類就是内容