1. 程式人生 > >java abstract 關鍵字 抽象方法和抽象類的使用詳解

java abstract 關鍵字 抽象方法和抽象類的使用詳解

java abstract 關鍵字 抽象類 抽象方法 的使用詳解

1.關鍵字

  1. 關鍵字abstract:抽象的,可以用來修飾類、修飾方法

2.抽象類

  1. 隨著繼承層次中一個個新子類的定義,類變得越來越具體,而父類則更一般,更通用。類的設計應該保證父類和子類能夠共享特徵,有時將父類設計得非常得抽象以至於它沒有具體的例項,這樣的類就叫做抽象類。也可以總結為:抽象類是用來模型化那些父類無法確定全部實現,而是由其子類提供具體實現的物件的類。
  2. 抽象類使用需注意的點
    ①不可被例項化
    ②抽象類有構造器(凡是類都有構造器)
    ③抽象方法所在的類,一定是抽象類
    ④抽象類中可以沒有抽象方法。

3.抽象方法

  1. 抽象類中只表明方法,沒有方法體的方法,主要用於宣告方法功能,交由子類去重寫(覆蓋),實現去其功能。
  2. 抽象方法使用需注意的點
    ①格式:沒有方法體,包括{};如:public abstract void eat();
    ②抽象方法只保留方法的功能,而具體的執行,交給繼承抽象類的子類,由子類重寫此抽象方法
    ③若子類繼承抽象類,並重寫了所有的抽象方法,即這個子類是一個“實體類”,即可以例項化
    ④若子類繼承抽象類,沒有衝寫所有的抽象方法,意味著子類仍有抽象方法,則宣告必須為abstract的!
    3.demo
public class TestAbstract {
	public static void main(String[] args) {
//		Person p1 = new Person();
//		p1.eat();
		Student s1 =  new Student();
		s1.eat();
		
		Person p = new Student();//多型
		p.eat();
	}
}
abstract class Person{
	String name;
	public abstract void eat();
	public abstract void walk(); 
	public Person() {
		
	}
	//不是抽象方法!只是沒有方法體
	public void sleep() {
		
	}
	public Person(String name) {
		this.name = name;
	}
}
class Student extends Person{
	public void eat() {
		System.out.println("student eat");
	}
	public void walk() {
		System.out.println("student walk");
	}
}
abstract class Worker extends Person{
	public void eat() {
		System.out.println("worker eat");
	}
//	public void walk() {
//		System.out.println("worker walk");
//	}
}

4.abstract不能用來修飾屬性、構造器、private、final、static

  1. dome
abstract class A{
//	對於類來講,它能夠例項化,因為它有構造器,對於方法來講,它能夠被子類重寫。
//	但在多型中的體現,並不包括屬性,具體調取屬性的,看的是引用是什麼,屬性無法覆蓋。
//	abstract int name; 
	
//	public abstract A() {
//	//因為構造器不能被重寫	
//	}
//	private abstract void method1();//子類不能覆蓋父類中宣告為private的方法
	
//	public abstract final void method1();//一個不讓重寫,一個又讓重寫,所以本身本來就矛盾
//  類方法可以類還沒有例項化的時候呼叫,但abstract修飾的本身就沒有方法體	
//	public abstract static void method3();
}