【Java】final修饰不同的内容时不同含义以及return和exit、dispose的含义——扫盲篇
在最近的学习中碰到了一些细节上的问题,于是看了其他相关的资料,总结出一些关于final修饰符的用法和return、exit在使用的时候应该如何去使用,更好的了解他们之间的区别,以便在使用的过程中更加得心应手
final关键字可以用来修饰类、方法、变量。各有不同。
final修饰符
A、修饰类(class)。
1、该类不能被继承。
2、类中的方法不会被重写,因此默认都是final的。
3、用途:设计类时,如果该类不需要有子类,
不必要被扩展,类的实现细节不允许被改变,那么就设计成final类
B、修饰方法(method)
1、该方法可以被继承,但是不能被重写。
2、用途:一个类不允许子类重写该方法,则用final来修饰
3、好处:可以防止继承它的子类修改该方法的意义和实现;更为高效,
编译器在遇到调用fianal方法转入内嵌机制,提高了执行效率。
4、注意:父类中的private成员方法不能被子类重写,因此,private方
法默认是final型的(可以查看编译后的class文件)
5.对于使用private修饰的方法,表示私有方法,只能是对象本身调用,
那么子类在继承时是无法访问该方法的,所以子类无法重写该方法。
C、修饰变量(variable)
1、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。
2、特点:可以先声明,不给初值,这种叫做final空白。但是使用前必
须被初始化。一旦被赋值,将不能再被改变。
3.a.类Field:必须在静态初始化块中或声明该Field时指定初始值。
b.实例Field:必须在非静态初始化块、声明该Field或构造器中指定初始值。
c.局部Field:系统不会对局部变量进行初始化,局部变量必须由程序员显示
初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值, 也
可以不指定默认值。
D、修饰参数(arguments)
1、用final修饰参数时,可以读取该参数,但是不能对其作出修改。
E、抽象类(abstract class)
1、抽象方法(abstract method):不含方法体的方法,它由继承它子类
根据需求去实现,必须用abstract修饰。此外,该方法必须对子类可见,
因此要加只能加public 或者 protected!。
2、抽象类:至少包含一个抽象方法的类(可以包含非抽象方法)。
必须用abstract修饰。
3、特点:抽象类不能被实例化(也就是不能new对象);
含有抽象方法的类必须声明为抽象类;一个类只有实现了抽象类
中的所有方法才能被实例化,否则它依然是抽象类。
F、接口(interface)
1、接口定义:抽象方法和常量值的集合(所有的方法都是抽象方法)。它是一种特殊的抽象类(会生成一个xxx.class文件,编译器会自动在interface关键字前加上abstract)。
2、特点:
a、接口里的常量默认都是public static final来修饰的
(如果什么都不写,编译器会自动帮你写上)。
b、接口里的方法默认都是public abstract来修饰的(如果是什么都不写,
编译器会自动帮你写上)。
c、可以用extends继承已有的接口。
d、一个类,可以用implements实现一个或多个接口中的所有
方法(包括这个接口的父接口中的方法)。
e、一个抽象类,可以implements实现接口中的部分方法
f、一个类,可以extends一个父类的同时implements多个接口,
但是extends关键字必须在implements关键字之前。
补充:
不可变类的意思是创建该类的实例后,该实例的Field是不可改变的。
创建自定义的不可变类,可遵循如下规则:
1. 使用private和final修饰符来修饰该类的Field
2. 提供参数构造器,用于根据传入参数来初始化类里的Field
3. 仅为该类的Field提供getter方法。
return和exit
System.exit(status);这个方法是用来结束当前正在运行中的
java虚拟机。如何status是非零参数,那么表示是非正常退出。
1. System.exit(0)是将你的整个虚拟机里的内容都停掉了 ,
而dispose()只是关闭这个窗口,但是并没有停止整个
application exit() 。无论如何,内存都释放了!也就是
说连JVM都关闭了,内存里根本不可能还有什么东西
2. System.exit(0)是正常退出程序,而System.exit(1)或者
说非0表示非正常退出程序
3. System.exit(status)不管status为何值都会退出程序。
和return 相比有以下不同点:return是回到上一层,
而System.exit(status)是回到最上层
4.在一个if-else判断中,如果我们程序是按照我们预
想的执行,到最后我们需要停止程序,那么我们使
用System.exit(0),而System.exit(1)一般放在catch
块中,当捕获到异常,需要停止程序,我们使用
System.exit(1)。这个status=1是用来表示这个程序是
非正常退出
正常退出与异常退出有什么区别?
public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态 码;根据惯例,非 0 的状态码表示异常终止。 该方法调用 Runtime 类中的 exit 方法。该方法永远不会正常返回。
调用 System.exit(n) 实际上等效于调用:
Runtime.getRuntime().exit(n)
System.exit(0):正常退出
System.exit(1):异常退出
其实他们的效果都是一样的,程序都会退出,关键是退出之后返回的不一样,看该程序外面怎么用了,如果不用返回结果的话,其实效果是一样的
java中的return
return语句作为一个无条件的分支,无需判断条件即可发生。return语句主要
有两个用途:一方面用来表示一个方法返回的值(假定没有void返回值),另一
方面是指它导致该方法退出,并返回那个值。根据方法的定义,每一个方法都
有返回类型,该类型可以是基本类型,也可以是对象类型,同时每个方法都必
须有个结束标志,因此,return起到了这个作用。在返回类型为void的方法里
面,有个隐含的return语句,因此,在void方法里面可以省略不写。
return和System.exit(0)在trycatch中
在try或catch中的return语句会将它的返回值压入栈内,然后执行
finally语句,当finally执行完成后,若finally语句里有return语
句,则执行return语句并结束。若finally没有return语句,则返回
被保存的栈里的return语句,再执行。然而,在压栈时候,要注意压入栈
内的是什么东西,是值本身还是引用,若是引用则引用的值会改变,若
是变量值,则不会改变。
结论: 如果try中碰到了return语句,那么会去执行finally语句,finally中
没有return语句,执行完finally中的代码后会执行try的return语句。
如果finally中有return语句的话,则直接使用finally的return返回
值,不再执行try中的return。但是如果try或者catch语句中遇到了
System.exit(0)则finally不会执行,因为整个虚拟机已经退出了。
另,对于方法中的返回值类型需要与try和catch的return值类型对
应,缺一不可。