Java关键字(五):final

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。Java关键字(五):final,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文



前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!

” final “关键字的使用

一、理解

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的构造器
*/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151096.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!