黑马程序员——JAVA基础之抽象和接口 , 模版方法设计模式

时间:2022-12-02 00:44:48

------- android培训java培训、期待与您交流! ---------- 

 

抽象定义:
          抽象就是从多个事物中将共性的,本质的内容抽取出来。
          例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。

抽象类:
          Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

抽象方法的由来:
          多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。
          例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。

 

什么时候使用抽象类:

          当多个类中出现相同功能,但是功能主体不同,
          这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。
 
         抽象大白话来说就是看不懂,抽象类和一般类没有太大的不同。 
         该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。 
         这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体。 
         通过抽象方法来表示。
 
 
抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。 
 
抽象类和一般类的区别:

       抽象类比一般类多个了抽象函数。就是在类中可以定义抽象方法。 
       抽象类不可以实例化。
 
       特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
 

abstract 关键字,和哪些关键字不能共存?           finnal,private,static 
        final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。 
        private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。而抽象方法出现的就是需要被复写。 
        static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。可是抽象方法运行没意义。
 
抽象类中是否有构造函数?
        有,抽象类是一个父类,要给子类提供实例的初始化。

 

/**
 * 抽象类的演示:
 *
 */

abstract class Student //只要类中有抽象方法,类就必须声明为抽象
{
	abstract void study(); //子类必须覆写该方法
}

class BaseStudent extends Student
{
	void study()
	{
		System.out.println("base study");
	}
}

class AdvStudent extends Student
{
	void study()
	{
		System.out.println("adv study");
	}
}

public class AbstractDemo 
{
	public static void main(String[] args)
	{
		new BaseStudent().study();
		new AdvStudent().study();
	}
}


 

/**
 * 模板设计模式
 * 		当定义功能时,一部分内容是确定的,一部分是不确定的,这时就要把不确定的部分暴漏出去。
 *
 * 例:获取某一程序的运行时间
 * 
 */

public class TemplateDemo 
{
	public static void main(String[] args)
	{
		new SubTime().etTime();
	}
}

abstract class GetTime
{
	//函数功能:获取runCode函数程序运行时间
	public final void etTime()//此函数声明出去但是不需要被子类覆写修改,用final修饰
	{
		long start = System.currentTimeMillis();
		runCode();
		long end = System.currentTimeMillis();
		
		System.out.println("The code run time is : "+(end-start)+" ms");
	}
	
	public abstract void runCode();//因为要运行的程序不确定,所以要子类覆写

}

class SubTime extends GetTime
{
	public void runCode()
	{
		int sum = 0;
		for (int x=1;x<=40000;x++)
		{
			sum += x;
			System.out.println(sum);
		}
	}
}


 

接口

初期理解,可以认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。


接口定义时,格式特点:
1,接口中常见定义:常量,抽象方法。
2,接口中的成员都有固定修饰符。常量:public static final   方法:public abstract
     记住:接口中的成员都是public的。

 

class用于定义类。   interface 用于定义接口。

 

接口中的成员修饰符是固定的。
   成员常量:public static final
   成员函数:public abstract

 

接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。 还可以在继承的同时实现多接口 class XXX exdents XXX implements XX , XX  因为没有方法主体,可以由子类随意定义。

 

接口特点:

   接口是对外暴露的规则。
   接口是程序的功能扩展。
   接口可以用来多实现。
   类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
   接口与接口之间可以有继承关系。

   接口是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类。

 

   接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。

 

 

/**
 * 
 * 接口interface程序演示
 *
 */

//定义一个接口
interface Inter
{
	//定义常量常用格式public static final,常量名一般全大写
	public static final double PI = 3.1415926;
	//定义函数常用格式 public abstract
	public abstract void show ();
}

//定义一个类实现接口
class InterTest implements Inter
{
	public void show()
	{
		System.out.println("PI = "+PI);
	}
}

public class InterfaceDemo
{
	public static void main(String[] args)
	{
		new InterTest().show();
	}
}


 

------- android培训java培训、期待与您交流! ----------