zoukankan      html  css  js  c++  java
  • 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/
    */
  • 相关阅读:
    Git出现error: Your local changes to the following files would be overwritten by merge: ... Please, commit your changes or stash them before you can merge.的问题解决(Git代码冲突)
    JDK内置工具jstack(Java Stack Trace)(转)
    Java 5/Java 6/Java7/Java 8新特性收集
    Linux使用screen实现关闭ssh连接的情况下,让程序继续在后台运行
    Linux出现cannot create temp file for here-document: No space left on device的问题解决
    解决树莓派8G的SD卡只能识别3.3G,SD卡扩容
    Windows下拷贝Linux的文件到本地(Putty)
    Linux下运行Java项目时,出现No X11 DISPLAY variable was set, but this program performed an operation which requires it.的问题解决
    Maven错误 diamond operator is not supported in -source 1.5 (use -source 7 or higher to enable diamond operator)问题解决
    Ubuntu下安装Maven
  • 原文地址:https://www.cnblogs.com/yiqiu2324/p/2871765.html
Copyright © 2011-2022 走看看