zoukankan      html  css  js  c++  java
  • 接口和抽象类相关面试题

    20.接口和抽象类相关.

    原始定义:

             抽象类,java中可定义一些不含方法体的方法,它的实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类叫做抽象类.必须用abstract来修饰.只需声明,不需要实现.含有抽象方法的类必须被声明为抽象类.

             抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是抽象类.

             抽象类中的方法不全是抽象的,但有抽象方法的肯定是抽象类.

             接口:如果一个抽象类中所有的方法都是抽象的,那么就可以用接口来定义.也就是接口.

    接口是抽象方法和常量值的定义的集合.

    本质上,接口是一种特殊的抽象类.这种抽象类只包含常量和方法的定义,而没有变量和方法的实现.

    1.       接口中的成员都是public.,接口中的变量标识为:public static final.

    2.       A接口可以用extends去继承B接口.

    3.       用implements关键字去实现一个接口中定义的部分方法.

    4.       一个类可以继承一个父类的同时,实现一个或者多个接口.extends必须位于implements之前.

    面试题:

    接口是否可以继承接口? 接口可以继承接口.

    抽象类是否可以实现接口? 抽象类可以实现(implements)接口,

    抽象类是否可以继承具体类? 可以.

    抽象类中是否可以有静态的main方法? 可以.

    备注:

             只要记住,抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstrct方法!

     

    21.写clone()方法,通常都有一行代码,为什么?

    Clone有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员.

    Object类有一个clone方法,用来创建并返回此对象的一个副本,这个方法是protected的,我们自已的类要使用clone方法,就必须扩大访问权限为public,如:

     public Object clone () throwsCloneNotSupportedException  {super.clone();  }

    22.abstractclass和interface有什么区别?

             1.抽象类可以有构造方法,接口不可以.

             2.抽象类中可以有普通的成员变量,普通的非抽象方法.接口不可以.

             3.抽象类中的抽象方法的访问类型可以说public,protected和默认类型,,但接口的抽象方法只能是public,默认即为public abstract类型.

             4.抽象方法可以包含静态方法,但接口不可以.

             5.抽象类和接口中都可以包含静态成员变量.抽象类中静态成员变量的访问类型可以任意.但接口只能是public static final类型(默认)

    6.一个类可以实现多个接口,但只能继承一个抽象类.

    .两者在应用上的区别如下:

    接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约.

    而抽象类在代码实现方面发挥作用,可以实现代码的重用.例如,模块设计模式是抽象类的一个典型应用,假设某个羡慕的所有Servlet类都要用相同的方式进行权限判断,记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断,记录访问日志和处理异常的代码,让各个子类中只是完成各自的业务逻辑代码,伪代码如下:

    1. public abstract class BaseServlet extendsHttpServlet  
    2.   
    3. {  
    4.   
    5.            publicfinal void service(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException  
    6.   
    7.            {  
    8.   
    9.                     //记录访问日志   
    10.   
    11.                     //进行权限判断   
    12.   
    13. if(具有权限)  
    14.   
    15. {  
    16.   
    17.          try  
    18.   
    19.          {  
    20.   
    21.                    doService(request,response);  
    22.   
    23. }  
    24.   
    25.          catch(Excetpione)  
    26.   
    27.          {  
    28.   
    29.                             //记录异常信息   
    30.   
    31.          }  
    32.   
    33. }  
    34.   
    35.            }  
    36.   
    37.            protectedabstract void doService(HttpServletRequest request, HttpServletResponseresponse) throws IOExcetion,ServletException;   
    38.   
    39. //注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的   
    40.   
    41. }  
    42.   
    43.    
    44.   
    45. public class MyServlet1 extends BaseServlet  
    46.   
    47. {  
    48.   
    49. protected voiddoService(HttpServletRequest request, HttpServletResponse response) throwsIOExcetion,ServletException  
    50.   
    51.            {  
    52.   
    53.                     //本Servlet只处理的具体业务逻辑代码   
    54.   
    55.            }  
    56.   
    57. }  
    public abstract class BaseServlet extendsHttpServlet
    
    {
    
               publicfinal void service(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException
    
               {
    
                        //记录访问日志
    
                        //进行权限判断
    
    if(具有权限)
    
    {
    
             try
    
             {
    
                       doService(request,response);
    
    }
    
             catch(Excetpione)
    
             {
    
                                //记录异常信息
    
             }
    
    }
    
               }
    
               protectedabstract void doService(HttpServletRequest request, HttpServletResponseresponse) throws IOExcetion,ServletException; 
    
    //注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的
    
    }
    
     
    
    public class MyServlet1 extends BaseServlet
    
    {
    
    protected voiddoService(HttpServletRequest request, HttpServletResponse response) throwsIOExcetion,ServletException
    
               {
    
                        //本Servlet只处理的具体业务逻辑代码
    
               }
    
    }
    

    父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。

     

    23. abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

             貌似都不行

    abstract的method 不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!

    native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。例如,FileOutputSteam类要硬件打交道,底层的实现用的是操作系统相关的api实现,例如,在windows用c语言实现的,所以,查看jdk 的源代码,可以发现FileOutputStream的open方法的定义如下:

    private native void open(String name)throws FileNotFoundException;

    如果我们要用java调用别人写的c语言函数,我们是无法直接调用的,我们需要按照java的要求写一个c语言的函数,又我们的这个c语言函数去调用别人的c语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明native。

    关于synchronized与abstract合用的问题,我觉得也不行,因为在我几年的学习和开发中,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。

  • 相关阅读:
    js获取多选框选择的值并拼接成字符串
    把不可枚举数组转换成可枚举数组
    js对接图片上传接口
    填数字游戏解题机
    带你深入了解nginx基本登录认证(包含配置步骤)
    高三whk回忆录
    SpringBoot异步任务
    Shell 脚本
    【Ubuntu】知识点及经验
    【Ubuntu】 安装相关
  • 原文地址:https://www.cnblogs.com/gxpblogs/p/3068066.html
Copyright © 2011-2022 走看看