Java全面细致讲解final的使用(java中final是什么)

网友投稿 298 2022-07-27


目录一、理解二、作用1. 修饰-类pZEIKzp2. 修饰-方法3. 修饰-变量3.1 修饰-成员变量(属性)3.2 修饰-局部变量三、经典题目

一、理解

final:最终的

二、作用

final 可以用来修饰的结构:类、方法、变量

1. 修饰-类

final 用来修饰一个类,表示此类不能被其它类所继承,提高安全性,提高程序的可读性。

比如:String类、System类、StringBuffer类…

代码演示:

final class A{}class B extends A{ //错误,不能被继承。}

2. 修饰-方法

final 用来修饰方法:表明此方法不能被子类重写。

比如:Object类中getClass();

代码演示:

class A {

public final void print() {

System.out.println("A");

}

}

class B extends A {

public void print() {

// 错误,不能被重写。

}

}

3. 修饰-变量

final 修饰的变量(成员变量或局部变量)称为常量。名称大写,且只能被赋值一次。

static final 用来修饰属性:全局常量。

代码演示:

class A {

private final String INFO = "嘻嘻"; //声明常量

public void print() {

//INFO = "哈哈";

//The final field A.INFO cannot be assigned

}

}

3.1 修饰-成员变量(属性)

final 标记的成员变量必须在声明(显式初始化)时或在 每个构造器中或代码块中显式赋值,然后才能使用。

如:final double MY_PI = 3.14;

3.2 修饰-局部变量

使用 final 修饰局部变量时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,且不能进行重新赋值。

三、经典题目

//题目一:

public class Test1 {

public int addOne(final int x) {

// return ++x;

//Cannot assign a value to final variable 'x'

return x + 1;

}

}

//题目二:

public class Something {

public static void main(String[] args) {

Other o = new Other();

new Something().addOne(o);

}

public void addOne(final Other o) {

// o = new Other();

o.i++;

}

}

class Other {

public int i;

}

//题目三:

class Root{

static{

System.out.println("Root的静态初始化块");

}

{

System.out.println("Root的普通初始化块");

}

public Root(){

super();

System.out.println("Root的无参数的构造器");

}

}

class Mid extends Root{

static{

System.out.println("Mid的静态初始化块");

}

{

System.out.println("Mid的普通初始化块");

}

public Mid(){

super();

System.out.println("Mid的无参数的构造器");

}

public Mid(String msg){

//通过this调用同一类中重载的构造器

this();

System.out.println("Mid的带参数构造器,其参数值:"

+ msg);

}

}

class Leaf extends Mid{

static{

System.out.println("Leaf的静态初始化块");

}

{

System.out.println("Leaf的普通初始化块");

}

public Leaf(){

//通过super调用父类中有一个字符串参数的构造器

super("小老师ir");

System.out.println("Leaf的构造器");

}

}

public class LeafTest{

public static void main(String[] args){

new Leaf();

System.out.println();

new Leaf();

}

}

/*output:

Root的静态初始化块

Mid的静态初始化块

Leaf的静态初始化块

Root的普通初始化块

Root的无参数的构造器

Mid的普通初始化块

Mid的无参数的构造器

Mid的带参数构造器,其参数值:小老师ir

Leaf的普通初始化块

Leaf的构造器

Root的普通初始化块

Root的无参数的构造器

Mid的普通初始化块

Mid的无参数的构造器

Mid的带参数构造器,其参数值:小老师ir

Leaf的普通初始化块

Leaf的构造器

*/


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot使用redisRepository和redistemplate操作redis的过程解析(springboot redistemplate新配置)
下一篇:Spring框架JdbcTemplate数据库事务管理完全注解方式(spring 注解事务)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~