• 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/
    */
  • 相关阅读:
    日志组件logback的介绍及配置使用方法(二)
    日志组件logback的介绍及配置使用方法(一)
    MyBatis+MySQL 返回插入的主键ID
    基于shiro-cas的单点登录、单点登出、统一认证授权系统
    使用Redis存储Nginx+Tomcat负载均衡集群的Session
    数字转大写钱币
    世界四大汽车生产公司
    强制登陆远程桌面
    sql 获取连续年份
    SQL 递归
  • 原文地址:https://www.cnblogs.com/yiqiu2324/p/2871765.html
Copyright © 2020-2023  润新知