day07_继承(下)

抽象类:

示例:

/*
抽象引入:
当多个类中出现相同功能,但是功能主体不同,
这是可以进行向上抽取.这时,只抽取功能定义,而
不抽取功能主体.

抽象类的特点:
1.抽象方法一定在抽象类中.

2.抽象方法和抽象类都必须abstract关键字修饰.

3.抽象类不可用new创建对象,因为调用抽象方法没意义

4.抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,
  建立子类对象调用.
  
  如果子类只复写了部分方法(依然有抽象方法),该子类还是一个抽象类

-->理解!
抽象类与一般类:
抽象类和一般类没有太大不同.
 该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西.
 这些不确定的部分,也是该事物的功能,需要明确出来,但是无法定义主体.
通过抽象方法来表示.

抽象类比一般类多了个抽象函数.就是在类中可以定义抽象方法.

*/

abstract class Student//abstract修饰类为了说明这个类是抽象类
{                     //里面有抽象方法,你创建对象
	                  //调用抽象方法没有意义!
  abstract void study();
  //abstract void study2();

}
class BaseStudent extends Student//如果加上 上面的abstract void study2();
                                 //BaseStudent为抽象类
{
  void study()
  {
   System.out.println("base study");
  }
}
class AdvStudent extends Student
{
	void study()
	{
	 System.out.println("adv study");
	
	}
}
class AbstractDemo
{
	public static void main(String[] args) 
	{
		new BaseStudent().study();
	}
}
/*
 抽象类中可以不定义抽象方法,这样做仅仅是不让该类创建对象.
*/

抽象简单演示
模板方法:
示例:
/*
 获取一段程序的运行时间.
  结束时间-起始时间
 利用System.currentTimeMillis();
*/
abstract class Run
{
 private long startTime;
 private long endTime;
 public final void getTime()//为了禁止子类复写(根据需要)
  { 
       startTime=System.currentTimeMillis();
       codeRun();//只创建了子类对象,调用getTime(),省略了this.codeRun()
       endTime=System.currentTimeMillis();
	   System.out.println("\t"+(endTime-startTime));
  }
  public abstract void codeRun();//这部分的内容是不确定
                                 //不一定抽象,根据需要
}
class CodeRun extends Run
{
 public void codeRun()
  {
    for(int i=1;i<1000;++i)
      System.out.print(i);
  }
}
class  TemplateDemo
{
	public static void main(String[] args) 
	{
         new CodeRun().getTime();

	}
}
/*
 什么是模板方法?
   在定义功能时,功能的一部分是确定的(getTime()),但是有一部分是不确定的(codeRun()),而确定的部分在使用不确定的部分.
   那么这时就将不确定的部分暴露出去.由该类的子类去完成.
 提高了拓展性和复用性.
*/
模板方法
接口(interface):

示例:

/*
接口:初期理解,可以认为是一个特殊的抽象类
  当抽象类中的方法都是抽象的,那么该类可以通过接口形式来表示.
interface用于定义接口.

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

接口:因为有抽象方法,因此不可以创建对象.
 需要子类实现,子类对接口中的抽象方法
 全都覆盖后,子类才能实例化.

接口可以被类 多实现,也是对多继承 不支持 的 转换形式.
  多实现不会出现多继承的问题(当多个父类中定义了
  相同功能,但功能内容不同,子类对象不能确定运行哪一个)

  因为多实现中的功能没有方法主体,由子类任意定义
  示例:
  interface A
  {
   public abstract void show();
  }
  interface B
  {
   public abstract void show();
  }
  class C implements A,B
  {
   public abstract void show()//同时复写了接口A,B中的功能
   {
     ...
   }
  }

*/
interface Inter//编译也是生成class(java可执行)文件
{
	public static final int NUM=3;//public static final即使不写 因为interface内有固定修饰符 
	public abstract void show();//public abstract同理
}

interface InterA
{
   public abstract void show();
}

class Demo
{
   public void function()
   {
   
   }
}

class Test implements Inter,InterA//为什么写implements(实现)?
{                                //接口中的功能全都为abstract,子类要复写之后才能使用
                                 //因此用implements来更确切描述
    public void show()
	{
	
	}
}


abstract class Test2  extends Demo implements Inter,InterA //继承一个类同时还能实现多个接口(不能先实现后继承)
{


}
//接口与接口之间是继承关系
//这是因为接口中的功能都是abstract
//接口之间存在多继承
//因为接口中的功能没有方法体({ }),不会冲突.

//例如:
interface A
{
  public abstract void methodA();
}
interface B
{
  public abstract void methodB();
}
interface C extends A,B
{
  public abstract void methodC();
}
class D implements C
{
  public void methodA(){}
  public void methodB(){}
  public void methodC(){}
}



class InterfaceDemo  
{
	public static void main(String[] args) 
	{
		
	}
}


/*
 接口是程序功能扩展
 例如:足球运动员踢足球,足球运动员(其它类型的运动员则不具有)还学java.
       那么这个学习功能定义在接口中.
abstract class Sporter
{
 abstract void play();

}
interface Study
{
  
  public abstract void study();

}
class FootballPlayer extends Sporter implements Study
{
  public void study()
  {
   
  }
  void play()
  {
  
  }
}
更好点例子:http://lengjianxxxx.blog.163.com/blog/static/81188402007410114157164/
*/
原文地址:https://www.cnblogs.com/yiqiu2324/p/2871765.html