欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java深入探究關(guān)鍵字abstract的使用

 更新時(shí)間:2022年05月17日 09:56:34   作者:小老師ir  
如果一個(gè)方法使用 abstract 來(lái)修飾,則說(shuō)明該方法是抽象方法,抽象方法只有聲明沒(méi)有實(shí)現(xiàn)。需要注意的是 abstract 關(guān)鍵字只能用于普通方法,不能用于 static 方法或者構(gòu)造方法中

1. 理解

abstract:抽象的

2. 作用

  • abstract可以用來(lái)修飾類(lèi)、方法。
  • 不能用abstract修飾變量、代碼塊、構(gòu)造器。
  • 不能用abstract修飾私有方法、靜態(tài)方法、final的方法、final的類(lèi)。

3. 修飾類(lèi)-抽象類(lèi)

  • 抽象類(lèi)中一定有構(gòu)造器,便于子類(lèi)實(shí)例化時(shí)調(diào)用(涉及:子類(lèi)對(duì)象實(shí)例化的全過(guò)程)。
  • 開(kāi)發(fā)中,都會(huì)提供抽象類(lèi)的子類(lèi),讓子類(lèi)對(duì)象實(shí)例化,完成相關(guān)的操作。
  • 抽象類(lèi)不能被實(shí)例化。抽象類(lèi)是用來(lái)被繼承的,抽象類(lèi)的子類(lèi)必須重寫(xiě)父類(lèi)的抽象方法,并提供方法體。若沒(méi)有重寫(xiě)全部的抽象方法,仍為抽象類(lèi)。

4. 修飾方法-抽象方法

抽象方法只有方法的聲明,沒(méi)有方法的實(shí)現(xiàn)。以分號(hào)結(jié)束。

public abstract void talk(); 

含有抽象方法的類(lèi)必須被聲明為抽象類(lèi)。反之,抽象類(lèi)中可以沒(méi)有抽象方法的。

  • 若子類(lèi)重寫(xiě)了父類(lèi)中的所有的抽象方法后,此子類(lèi)方可實(shí)例化 。
  • 若子類(lèi)沒(méi)有重寫(xiě)父類(lèi)中的所有的抽象方法,則此子類(lèi)也是一個(gè)抽象類(lèi),需要使用abstract修飾。

5. 代碼演示

public class AbstractTest {
	public static void main(String[] args) {		
		//一旦Person類(lèi)抽象了,就不可實(shí)例化
//		Person p1 = new Person();
//		p1.eat();		
	}
}
abstract class Creature{
	public abstract void breath();
}
abstract class Person extends Creature{
	String name;
	int age;	
	public Person(){		
	}
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}	
	//不是抽象方法:
//	public void eat(){
//		
//	}
	//抽象方法
	public abstract void eat();	
	public void walk(){
		System.out.println("人走路");
	}		
}
class Student extends Person{	
	public Student(String name,int age){
		super(name,age);
	}
	public Student(){
	}	
	public void eat(){
		System.out.println("學(xué)生多吃有營(yíng)養(yǎng)的食物");
	}
	@Override
	public void breath() {
		System.out.println("學(xué)生應(yīng)該呼吸新鮮的沒(méi)有霧霾的空氣");
	}
}

6. 經(jīng)典題目

public class Test1 {
    public static void main(String args[]) {
        A a = new B();
        a.m1();//B類(lèi)中定義的m1方法
        a.m2();//A類(lèi)中定義的m2方法
    }
}
abstract class A {
    abstract void m1();
    public void m2() {
        System.out.println("A類(lèi)中定義的m2方法");
    } 
}
class B extends A {
    void m1() {
        System.out.println("B類(lèi)中定義的m1方法");
    } 
}

7. 抽象類(lèi)的匿名子類(lèi)

public class PersonTest {	
	public static void main(String[] args) {	
		//匿名對(duì)象		
		method(new Student());
		//非匿名的類(lèi)非匿名的對(duì)象
		Worker worker = new Worker();
		method1(worker);
		//非匿名的類(lèi)匿名的對(duì)象
		method1(new Worker());
		//創(chuàng)建了一匿名子類(lèi)的對(duì)象:p
		Person p = new Person(){
			@Override
			public void eat() {
				System.out.println("吃東西");
			}
			@Override
			public void breath() {
				System.out.println("好好呼吸");
			}			
		};		
		method1(p);
		//創(chuàng)建匿名子類(lèi)的匿名對(duì)象
		method1(new Person(){
			@Override
			public void eat() {
				System.out.println("吃好吃東西");
			}
			@Override
			public void breath() {
				System.out.println("好好呼吸新鮮空氣");
			}
		});
	}		
	public static void method1(Person p){
		p.eat();
		p.breath();
	}	
	public static void method(Student s){		
	}
}
class Worker extends Person{
	@Override
	public void eat() {
	}
	@Override
	public void breath() {
	}	
}

8. 應(yīng)用-模板方法設(shè)計(jì)模式(TemplateMethod)

抽象類(lèi)體現(xiàn)的就是一種模板模式的設(shè)計(jì),抽象類(lèi)作為多個(gè)子類(lèi)的通用模板,子類(lèi)在抽象類(lèi)的基礎(chǔ)上進(jìn)行擴(kuò)展、改造,但子類(lèi)總體上會(huì)保留抽象類(lèi)的行為方式。

當(dāng)功能內(nèi)部一部分實(shí)現(xiàn)是確定的,一部分實(shí)現(xiàn)是不確定的。這時(shí)可以把不確定的部分暴露出去,讓子類(lèi)去實(shí)現(xiàn)。

換句話說(shuō),在軟件開(kāi)發(fā)中實(shí)現(xiàn)一個(gè)算法時(shí),整體步驟很固定、通用,這些步驟已經(jīng)在父類(lèi)中寫(xiě)好了。但是某些部分易變,易變部分可以抽象出來(lái),供不同子類(lèi)實(shí)現(xiàn)。這就是一種模板模式。

模板方法設(shè)計(jì)模式是編程中經(jīng)常用得到的模式。各個(gè)框架、類(lèi)庫(kù)中都有他的影子,比如常見(jiàn)的有:

 數(shù)據(jù)庫(kù)訪問(wèn)的封裝;

  • Junit單元測(cè)試;
  • JavaWebServlet中關(guān)于doGet/doPost方法調(diào)用;
  • Hibernate中模板程序;
  • SpringJDBCTemlateHibernateTemplate等;
abstract class Template {
   public final void getTime() {
      long start = System.currentTimeMillis();
      code();
      long end = System.currentTimeMillis();
      System.out.println("執(zhí)行時(shí)間是:" + (end - start));
    }
      public abstract void code();
}
class SubTemplate extends Template {
      public void code() {
        for (int i = 0; i < 10000; i++) {
        System.out.println(i);
        } 
      } 
}

到此這篇關(guān)于Java深入探究關(guān)鍵字abstract的使用的文章就介紹到這了,更多相關(guān)Java abstract內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論