文章目錄
- 初始化塊
-
- 非靜态代碼塊:沒有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();
}
}
發現:
靜态代碼塊隻執行一次
非靜态代碼塊,每次new對象的時候重複執行。
靜态代碼塊:用static 修飾的代碼塊
1.可以有輸出語句。
2.可以對類的屬性聲明進行初始化操作。
3.不可以對非靜态的屬性初始化。即:不可以調用非靜态的屬
性和方法。
4.若有多個靜态的代碼塊,那麼按照從上到下的順序依次執行。
5.靜态代碼塊的執行要先于非靜态代碼塊。
6.靜态代碼塊隻執行一次
在實際開發中,靜态代碼塊用的會多一些
這有什麼用?
static int age=18;不就可以了嗎?,為什麼要在靜态代碼塊裡面指派?
因為age 是簡單的屬性,換一個例子看
新加一個test方法,建立一個匿名類,alt+/ ,方法的重寫。
這個是匿名類,不能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來修飾一個方法時,該方法叫做抽象方法。
抽象類不能被執行個體化。抽象類是用來作為父類被繼承的,抽象類的子類必須重寫父類的抽象方法,并提供方法體。
抽象類一定要有抽象方法,或者提供方法體(不是抽象方法了)
不能用abstract修飾屬性、私有方法、構造器、靜态方法、final的方法。
含有抽象方法的類必須被聲明為抽象類。
代碼沒有報錯,但是不能運作?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)
抽象類作為多個子類的通用模闆,子類在抽象類的基礎上進行擴充、改造,但子類總體上會保留抽象類的行為方式。
抽象類是一個大綱,抽象方法就算章節,子類就是内容