Override Private/Protected Method/Exception Catch

Override Private/Protected Method/Exception Catch

对于使用private修饰符修饰的方法,只能在当前类中访问到该方法,子类无法访问父类中定义的private方法。既然子类无法访问父类的private方法,当然也就无法重写该方法。

如果子类中定义了一个与父类private方法具有相同方法名,相同形参列表,相同返回值类型的方法,依然不是重写,只是子类中重新定义了一个新方法。如果使用@override来修饰Base类中的方法。

如果父类中定义了使用默认访问控制符(也就是不适用访问控制符)的方法,这歌方法同样可能无法被重写。

对于不使用访问控制符修饰的方法,它只能被与当前类处于同一个包中的其他类访问,其他包中的子类依然无法访问该方法。

import java.io.FileOutputStream;

import java.io.IOException;

 

public class ExitFinally {

    public static void main(String[] args) throws IOException{

      FileOutputStreamfos = null;

      try{

            fos= newFileOutputStream("a.bin");

            System.out.println("Openresource!");

            System.exit(0);

      }finally{

            if(fos != null){

                  try{

                        fos.close();

                  }catch(Exception ex ){

                        ex.printStackTrace();

                  }

            }

            System.out.println("Closeresource!");

      }

    }

}

Output:

Openresource!

这个程序的try块中增加了System.exit(0)来退出程序。如果程序在执行System.exit(0)后,finally块有时候不会执行。System.exit(0)将停止当前线程和所有其他当场死亡的线程。Finally块并不能让已经停止的线程继续执行。

当System.exit(0)被调用时,虚拟机退出前要执行两项清理工作:

执行系统中注册的所有关闭钩子;

如果程序调用了System.runFinalizerOnExit(true);那么JVM汇兑所有还未结束的对象调用Finalizer。

 

当Java运行时环境接收到异常对象时,系统会根据catch(XxxException)语句决定使用哪个异常分支来处理程序引发的异常。

通常情况下,如果try块被执行依次,则try块后只有一个catch块会被执行,决不可能有多个catch块被执行。除非在循环中使用了continue开始下一个循环,下一个循环又重新运行了try块,才可能导致多个catch块被执行。

比如,程序FileNotFoundExcetion异常是IOException的子类。根据Java继承的特性,子类其实是一种特殊的父类,也就是说,FileNotFoundException只是一种特殊的IOException。程序前面的catch块已经捕捉了IOException,这意味着FileNotFoundException不会被执行,然后编译器会抛错。

由于Exception是所有异常类的根父类,因此try..catch块应该把捕捉Exception的catch块排在所有catch块的最后面。否则,Java运行时将直接进入捕捉Exception的catch块(因为所有异常对象都是Exception或其子类的实例),而排在它后面的catch块将永远也不会获得执行的机会。当然,编译器会直接提示编译错误,阻止这样的代码获得执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个基于Java Servlet的控制器类的部分实现。让我来逐行解释一下: 1. `private static final long serialVersionUID = 1L;`:这是一个序列化版本号,用于确保当类的结构发生变化时,仍然能够正确地反序列化对象。 2. `protected String path;`:这是一个跳转路径的变量,用于存储需要跳转到的页面路径。 3. `@Override`:这是一个注解,表示我们将重写父类的`service`方法。 4. `protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException`:这是重写的`service`方法,它处理客户端请求,并将结果发送回客户端。 5. `String contentType=req.getContentType();`:获取请求的内容类型。 6. `String methodName=req.getParameter("methodName");`:获取名为"methodName"的请求参数的值。 7. `if(methodName!=null&&!"".equals(methodName))`:检查请求参数"methodName"是否为空或空字符串。 8. `Class<? extends BaseController> aClass=this.getClass();`:获取当前类的Class对象。 9. `Method method =aClass.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);`:通过方法名和参数类型获取对应的Method对象。 10. `Object result=method.invoke(this, req,resp);`:通过反射调用方法,并获取返回结果。 11. `if(result!=null)`:检查返回结果是否为空。 12. `if(result instanceof String)`:检查返回结果是否为String类型。 13. `String resultStr=(String) result;`:将返回结果强制转换为String类型。 14. `if(resultStr.startsWith(Dictionary.FORWARD))`:检查返回结果是否以"FORWARD"开头。 15. `String path=resultStr.substring(resultStr.indexOf(Dictionary.FLAG)+1);`:从返回结果中获取跳转路径。 16. `req.getRequestDispatcher(path).forward(req, resp);`:根据跳转路径进行内部转发。 17. `else if(resultStr.startsWith(Dictionary.REDIRECT))`:检查返回结果是否以"REDIRECT"开头。 18. `String path=req.getContextPath()+resultStr.substring(resultStr.indexOf(Dictionary.FLAG)+1);`:构造重定向路径。 19. `resp.sendRedirect(path);`:执行重定向。 20. `else`:如果返回结果不是转发或重定向路径,则将结果直接写入响应。 这段代码的作用是根据请求参数中的方法名调用相应的方法,并根据方法的返回结果进行页面跳转或直接返回结果。它通过反射来实现动态调用方法,提供了一种灵活的控制器实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值