🍅 Java学习路线配套文章:搬砖工逆袭Java架构师
🍅 基础推荐:Java基础教程系列
🍅 实战推荐:Spring Boot基础教程
🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌ 、Java架构师奋斗者💪
🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步
🍅 欢迎点赞 👍 收藏 ⭐留言 📝
目录
一、 final
1、修饰引用
2、修饰方法
3、修饰类
二、Java中的对象析构与finalize方法
三、static
1、static变量
2、静态变量和非静态变量的区别
3、static方法
4、static代码块
(1)代码实例
(2)利用static代码块的方式优化代码
一、 final
final关键字可以用来修饰引用、方法和类。
1、修饰引用
- 如果引用为基本数据类型,则该引用为常量,该值无法修改;
- 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
- 如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
2、修饰方法
当使用final修饰方法时,这个方法无法被子类重写。但是,该方法仍然可以被继承。
3、修饰类
当用final修改类时,该类成为最终类,无法被继承。
二、Java中的对象析构与finalize方法
有些面向对象的程序设计语言,特别是C++,有显式的析构器方法,其中放置一些当对象不再使用时需要执行的清理代码。在析构器中,最常见的操作是回收分配给对象的存储空间。由于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器。
当然,某些对象使用了内存之外的其它资源,例如,文件或使用了系统资源的另一个对象的句柄。在这种情况下,当资源不再需要时,将其回收和再利用将显得十分重要。
可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖于使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法什么时候才能够调用。
注释:有个名为System.runFinalizersOnExit(true) 的方法能够确保finalize方法在Java关闭前被调用。不过这个方法并不安全,也不鼓励大家使用。有一种代替的方法是使用方法Runtime.addShutdownHook添加“关闭钩”(shutdown hook),详细内容请参看API文档。如果某个资源需要在使用完毕后立刻被关闭,那么就需要由人工来管理。可以应用一个类似dispose或close的方法完成相应的清理操作。特别需要说明,如果一个类使用了这样的方法,当对象不再被使用时一定要调用它。
三、static
static的作用就是方便在没有创建对象的情况下来进行调用(方法/变量)。
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
1、static变量
public static String name = "哪吒";
静态域可以用方法.静态域的方式访问;
可以通过静态方法访问;
2、静态变量和非静态变量的区别
静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
3、static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
4、static代码块
可以通过static代码块的形式提高程序性能,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
(1)代码实例
未用static静态代码块的方式, startDate 和 endDate其实可以看做是一个常量,每次使用的时候,值都是一样的,没必要每次调用方法都初始化一遍。
package com.nezha.javase;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test1107 {
private String name;
private Date birthDate;
public Test1107(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
/**
* 定义一个通用的SimpleDateFormat
* private 本类内使用
* static 提高性能
* final 不可修改
*/
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
boolean is90() throws ParseException {
Date startDate = sdf.parse("1990-01-01");
Date endDate = sdf.parse("2000-01-01");
return this.birthDate.compareTo(startDate)>=0 && this.birthDate.compareTo(endDate) < 0;
}
public static void main(String[] args) throws ParseException {
Date date = sdf.parse("1999-09-01");
Test1107 test = new Test1107("哪吒",date);
String msg = test.getName() + (test.is90()?"是90后":"不是90后");
System.out.println(msg);
}
}
(2)利用static代码块的方式优化代码
package com.nezha.javase;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StaticTest {
private String name;
private Date birthDate;
public StaticTest(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
/**
* 定义一个通用的SimpleDateFormat
* private 本类内使用
* static 提高性能
* final 不可修改
*/
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
/**
* 利用静态代码块的方式优化性能
*/
private Date startDate;
private Date endDate;
static {
try {
Date startDate = sdf.parse("1990-01-01");
Date endDate = sdf.parse("2000-01-01");
} catch (ParseException e) {
e.printStackTrace();
}
}
boolean is90() throws ParseException {
return this.birthDate.compareTo(startDate)>=0 && this.birthDate.compareTo(endDate) < 0;
}
public static void main(String[] args) throws ParseException {
Date date = sdf.parse("1999-09-01");
Test1107 test = new Test1107("哪吒",date);
String msg = test.getName() + (test.is90()?"是90后":"不是90后");
System.out.println(msg);
}
}
上一篇:Java零基础入门 9:Java Date类
下一篇:Java零基础入门 11:Java继承
添加微信,备注1024,赠送Java学习路线思维导图