zoukankan      html  css  js  c++  java
  • final,finally和finalize三者的区别和联系

        对于初学者而言(当然也包括我)对于这三者真的不是很陌生,经常会看到它们。但对于三者之间的区别和联系一直是懵懵懂~~

    今天心情不错,那就简单总结一下它们几个的区别和联系吧。如果又不对的地方欢迎批评指正~~

        1.final

           final是java的中的一个关键字。final关键字可以用来修饰属性,方法和类。还有就是如果内部类要访问局部变量的话,那么对应的局

           部变量也必须为final关键字修饰的。

           首先,使用final修饰的属性是不能够修改的。

                   例如:final int VALUE=100; 那么这里的VALUE的值是不能够修改的。

           其次,是使用final修饰的方是不能够被重写的。

                   例如:如果某个子类继承了某个父类的话,那么一般而言这个子类是可以重写它们的父类的方法。

                          但是如果这个父类中的方法使用final关键字修饰的话,那么子类是不允许重写父类中final修饰的方法。

                   为了更好的说明这里点请看下面的代码:

    /**
     * 创建Person实例,作为Children类的父类
     * @author 小浩
     * @创建日期 2015-3-2
     */
    class Person{
    	/**
    	 * 大人可以挣钱,小孩是不能够挣钱的,
    	 * 所以children类是不能够重写该方法
    	 */
       public final void makeMoney(){
    	   System.out.println("我长大后要挣好多好多的钱哦~~~");
       }
    	
    }
    
    /**
     * 孩子类继承了Person类,单Children类无法重写makeMoney方法
     * 因为此方法以使用final修饰
     * @author 张浩
     * @创建日期 2015-3-2
     */
    class Children extends Person{
    	
    	/**
    	 * 这里报下面的错误,提示无法重写此方法
    	 * Cannot override the final method from Person
    	 */
    	@Override
    	public void makeMoney(){
    		System.out.println("我是小孩,我想要挣钱~~");
    	}
    	
    }
    

        

        最后,final修饰的类是不能够被继承的。也就是说,如果一个类使用final修饰符,那么它是不能够作为任何类的父类的。

                   例如:上面的Person类如果使用final修饰话,那么Children类就不能够继承Person类了哦。

      

          总结,final修饰符出现主要作用是为了使相应的变量,对象或者方法一旦创建后,就不在发生任何改变。final修饰符比较经典的使用是

                   jdk中的String类,如果感兴趣可以查看jdk的源码。

                   此外给大家补充一个比较经典的例子(在阅读下面的例子之前,请先弄明白上面的内容):

    /**
     * 测试类
     * @author 张浩
     * @创建日期 2015-3-2
     */
    public class Test2{
    	public static void main(String[] args) {
    		 final StringBuffer VALUE=new StringBuffer("我考试好看100分,厉害不?");
    		 System.out.println(VALUE);
    		 //VALUE的值发生了改变,请问下面的例子是否会报错????
    		 VALUE.append("不好意思,满分150分哦~~SB");
    		 System.out.println(VALUE);
    	
    	}    
    }
    

           首先说明上面不会报错的。

            对于final修饰的变量其对应值是不能够发生改变的。需要注意的是VALUE这个变量名是存储在栈中的,final修饰符不能够改变指的是VALUE指向堆中的内存地址的值是不能够改变的,因为StringBuffer可以在原来字符串的基础上面动态的修改。所以上面是没问题的

    但是如果把StringBuffef换成为String的话,那样的话就不行了(String一旦创建后是不能够修改的哦)。

    /**
     * 测试类
     * @author 小浩
     * @创建日期 2015-3-2
     */
    
    public class Test2{
    	public static void main(String[] args) {
    		 final String VALUE=new String("我考试好看100分,厉害不?");
    		 System.out.println(VALUE);
                     //下面是会报错的哦...
    		 VALUE=VALUE+"不好意思,满分150分哦~~SB";
    		 System.out.println(VALUE);
    	
    	}    
    }
    

          2.finally

            finally关键字一般也用在处理try{}catch{}finally{}的异常中,finally里面的内容一定会执行。

            一般用在异常处理中资源的释放。对于try{}catch{}finally{}的讲解可以参考:

            http://www.cnblogs.com/xiohao/p/4278405.html

          3.finalize

             finalize在垃圾回收中会使用。finalize是Object类中的方法。在垃圾回收器执行的时候会调用被回收对象的此方法。

             用户可以重写此方法,已完成对其它资源的回收。如关闭文件等。JVM不保证此方法一定会执行哦~~~~

         

          好吧,今天就先到这里吧~~

      

      

                   

          

     

                       

           

  • 相关阅读:
    虚拟化基础介绍
    Linux---1.06.用户和用户组管理
    1.vmware tools的安装
    5.无法更新包,yum源更换无效
    Linux---1.05.软件包管理
    4.Vim的安装及待解决问题
    NSWorkspace的mountedLocalVolumePaths
    修改系统默认的NSButton的按下变灰
    NSParagraphStyleAttributeName
    - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
  • 原文地址:https://www.cnblogs.com/xiohao/p/4308494.html
Copyright © 2011-2022 走看看