Java面向对象核心修饰符,final修饰符、常量、常量方法与常量类

这篇具有很好参考价值的文章主要介绍了Java面向对象核心修饰符,final修饰符、常量、常量方法与常量类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

之前跟大家说过,在面向对象中,有abstract、static和final 这3个核心修饰符。截止到现在,我们已经把abstract与static修饰符学习完毕,接下来就让我们再来学习final修饰符的用法与特性吧。


全文大约 【3500】字 ,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考

一. final修饰符

1. 简介

在Java中,final表示“最终的、不可改变的、完结的”,它也是一种修饰符,可以修饰变量、方法和类。final修饰变量、方法和类时的意义是不同的,但本质是一样的,都表示不可改变,类似C#里的sealed关键字。final修饰的变量叫做最终变量,也就是常量,修饰的方法叫做最终方法,修饰的类叫做最终类。

二. 常量

1. 概念

被final修饰的变量一旦被赋值初始化后,就不能再被重新赋值。即变量值只能被赋值一次,不可被反复修改,所以叫做最终变量,也叫做常量。
并且我们在定义final变量时,必须显式地进行初始化,指定初始值,否则会出现“The blank final field xxx may not have been initialized”的异常提示。变量值的初始化,可以在两个地方:一是在变量定义处,即在final变量定义时直接给其赋值;二是在构造方法或静态代码块中。这些地方只能选其一,不能同时既在定义时赋值,又在构造方法或静态代码块中另外赋值。
我们在开发时,通常会把final修饰符和static修饰符一起使用,来创建类的常量。

2. 特性

根据修饰变量的作用范围,比如在修饰局部变量和成员变量时,final会有不同的特性:

●final修饰局部变量时,在使用之前必须被赋值一次才能使用;
●final修饰成员变量时,如果在声明时没有赋值,则叫做“空白final变量”,空白final变量必须在构造方法或静态代码块中进行初始化。
根据修饰变量的数据类型,比如在修饰基本类型和引用类型的变量时,final也有不同的特性:
●final修饰基本类型的变量时,不能把基本类型的值重新赋值,因此基本类型的变量值不能被改变。
●final修饰引用类型的变量时,final只会保证引用类型的变量所引用的地址不会改变,即保证该变量会一直引用同一个对象。因为引用类型的变量保存的仅仅是一个引用地址,所以final修饰引用类型的变量时,该变量会一直引用同一个对象,但这个对象本身的成员和数据是完全可以发生改变的。

3. 语法

final修饰变量时,常用的语法格式如下:

final String 变量名=变量值;
我们在使用final声明变量时,一般会要求变量名的单词全部大写,且变量名由多个单词组成时,多个单词之间用下划线“_”分隔开,比如“SCHOOL_NAME”。

4. 案例

4.1 修饰局部变量

以下案例是final修饰局部变量时的用法和特性。

public class FinalDemo {

	// final修饰局部变量,该变量使用之前要赋初值
	public void declareFinal() {
		// 先声明变量
		final int x;
		// 再赋初值,该值只能赋一次,否则会报错。
		x = 200;
		//The final local variable x may already have been assigned
		//x = 400;
		System.out.println("x=" + x);

		// 声明的同时赋值
		final int y = 300;
		System.out.println("y=" + y);
	}

}

从上述案例中可知,局部常量最好是在声明时就进行初始化。而且常量只能被赋值一次,否则会出现编译错误:“The final local variable xxx may already have been assigned”。

4.2 修饰成员变量

以下案例是final修饰成员变量时的用法和特性。

public class FinalDemo {
	//final修饰成员变量

	// 实例常量
	final int a = 10; // 直接赋值
	final int b; // 空白final变量,需要在构造方法中进行初始化

	// 静态常量
	final static int c = 20;// 直接赋值
	final static int d; // 空白final变量,需要在静态代码块中进行初始化

	static {
		// 初始化静态变量
		d = 40;
	}

	FinalDemo() {
		// 初始化成员变量
		b = 20;
		// 不能第二次赋值,否则会发生编译错误
		// The final local variable b may already have been assigned
		//b = 30;
	}
    
}

从上述代码中可知,空白final变量,可以在构造方法或静态代码块中初始化。

4.3 修饰基本类型的变量

以下案例是final修饰基本类型变量时的用法和特性。final修饰基本类型的变量时,不能把基本类型的变量重新赋值,因此基本类型的变量值不能被改变,否则会出现“The final local variable x cannot be assigned. It must be blank and not using a compound assignment”的异常。

public class FinalTypeDemo {

	public static void main(String[] args) {
		//final修饰基本类型的变量,变量值不可变
		final int x=10;
		
		//The final local variable x cannot be assigned. It must be blank and not using a compound assignment
		//x=20;
		System.out.println("x="+x);
	}

}

4.4 修饰引用类型的变量

以下案例是final修饰引用类型变量时的用法和特性。final修饰引用类型的变量时,final只会保证引用类型的变量所引用的地址不会改变,即保证该变量会一直引用同一个对象,否则会出现“Array constants can only be used in initializers”或者“The final local variable user cannot be assigned. It must be blank and not using a compound assignment”的异常。

import java.util.Arrays;

public class FinalTypeDemo {

	public static void main(String[] args) {
		// final修饰数组变量,nums是一个引用变量
        final int[] nums = { 1, 9, 7, 3 };
        System.out.println(Arrays.toString(nums));
        
        //final修饰引用类型时,引用的地址不可变,但引用对象本身的数据内容是可变的
        //Array constants can only be used in initializers
        //nums= {2,0,8,1};
       
        // 对数组里的元素赋值修改没问题
        nums[2] = 10;
        System.out.println(Arrays.toString(nums));
        
        // final修饰Person变量,p是一个引用变量
        final User user = new User();
        // 改变Person对象的age实例变量,合法
        user.setAge(18);
        System.out.println(user.getAge());
        
        //对user变量的引用地址重新赋值,非法
        //The final local variable user cannot be assigned. It must be blank and not using a compound assignment
        //user = new User(30);
	}

}

从上面的两个案例中,我们可以得知,使用 final修饰引用类型的变量时,变量不能被重新赋值,但我们可以改变该变量所引用对象里的内容。

三. 常量方法

1. 概念

被final修饰的方法称为常量方法,该方法可以被重载,也可以被子类继承,但却不能被重写。当一个方法的功能已经可以满足当前要求,不需要进行扩展,我们就不用任何子类来重写该方法,防止该方法的内容被修改。比如Object类中,就有一个final修饰的getClass()方法,Object的任何子类都不能重写这个方法。

2. 语法

final修饰方法时,常用的语法格式如下:
修饰符 final 返回值类型 方法名(){
//方法体
}

3. 案例

3.1 子类不能重写父类的final方法

如果我们在父类中定义一个final方法,子类继承父类后,子类不能重写父类中的这个final方法,否则会出现“Cannot override the final method from Father”异常。但是我们要注意,final方法是可以被重载的!

public class Father {
	
	private String name;
	
	public final void setName(String name) {
		this.name=name;
	}

    //重载final方法
	public final void setName(String firstName,String lastName) {
		this.name=firstName+lastName;
	}

}

//子类继承父类
public class Son extends Father{
	
	private String name;
	
	//子类不能重写父类中的final方法!
	//Cannot override the final method from Father
	//public void setName(String name) {
	//	this.name=name;
	//}

}
3.2 父类中私有的final方法

如果我们在父类中定义了一个私有的private方法,因为它只能在当前类中可见,其子类无法访问该方法,所以子类也就无法重写该方法。如果子类中也定义了一个与父类中完全相同的private方法,这也不算方法重写,这只是重新定义了一个新方法。因此,即使我们使用final修饰private方法,我们也可以在其子类中定义与该方法相同的方法。

public class Father {
	
	private double salary;
	
	//父类中私有的方法
	private final void setSalary(double salary) {
		this.salary=salary;
	}

}

//子类继承父类
public class Son extends Father{
	
	private double salary;

	//子类中定义与父类同名通参的方法,这不属于方法重写!
	private void setSalary(double salary) {
		this.salary=salary;
	}
    
}

四. 常量类

1. 概念

我们知道,通常子类继承父类时,子类可以访问父类的内部数据,并可通过重写父类的方法来改变父类方法的实现细节。但这样做可能会导致一些不安全的因素,所以为了保证某个类不可被继承,我们就可以使用final来修饰这个类。被final修饰的类称为常量类,这种类不能被继承,也就不能被修改或扩展。
final类无法被任何其他类继承,这意味着该类在Java的继承树体系中是一个叶子类,比如我们经常使用的String类,就是典型的final类。如下图所示:
Java面向对象核心修饰符,final修饰符、常量、常量方法与常量类
而final类中的成员,我们可以用final修饰,也可以不用final修饰。比如final类中的方法,因为这些方法本身就属于final类,该类都不能被子类继承,里面的所有方法自然也就不能被子类重写,那么这些方法自然也就成了final型。所以final中的变量和方法,我们都没必要再单独添加final修饰符了。

2. 语法

final修饰类时,常用的语法格式如下:
访问修饰符 final class 类名{
//…
}

3. 案例

/**
 * 
 * 父类是final类
 */
public final class Father {
	
	......
}

//此时子类不能继承父类,否则会出错!
public class Son extends Father{
	
	......
}

从上面的代码中我们可以验证得知,final类不能被继承,final类中的方法更不可能被重写,否则会出现“The type Son cannot subclass the final class Father”异常,如下图所示:
Java面向对象核心修饰符,final修饰符、常量、常量方法与常量类


五. 结语

至此,就把final与常量、常量方法、常量类等相关内容讲解完毕了,现在你知道final的特性都有哪些吗?最后重点给大家总结如下:

●final修饰的变量,其变量值不可被改变,此时的变量被称为常量;
●final修饰引用类型的变量时,引用地址不可变,但对象中的数据可变;
●final修饰的方法不可以被重写;
●final修饰的类不可以被继承,即不能有子类。文章来源地址https://www.toymoban.com/news/detail-439739.html

到了这里,关于Java面向对象核心修饰符,final修饰符、常量、常量方法与常量类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java的final修饰符

    可以将实例域定义为 final。对于 final 域来说,构建对象时必须初始化 final 实例域,构造对象之后就不允许改变 final 实例域的值了。也就是说,必须确保在每一个构造器执行之后,final 实例域的值被设置,并且在后面的操作中,不能够再对 final 实例域进行修改。 例如,可以

    2023年04月24日
    浏览(35)
  • 第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)

    回顾类中的实例变量(即非static的成员变量) 创建两个Circle对象: Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,c1中的radius变化不会影响c2的radius,反之亦然。 如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(

    2024年01月25日
    浏览(48)
  • 〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

    说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费 , 如需要项目实战或者是体系化资源,文末名片加V! 作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。 荣誉: 2022年度博客之星Top4、2023年度超级个体得主、谷

    2024年02月04日
    浏览(72)
  • 面向对象(八)-- static 与 final 关键字 的使用

    目录 1.  static 1.1  static 的概述 1.2  static 修饰的特点 1.3  static 使用时的注意事项:

    2023年04月25日
    浏览(48)
  • Java 基础进阶篇(三)—— 权限修饰符、final 关键字与枚举

    权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符: 有四种作用范围由小到大 (private - 缺省 -protected - public) 注: 不同包下的子类指的是,不同包下的子类对象能访问,当前类创建父类对象访问不了。 定义成员变量、构造器、方法等一般需满足如下要

    2024年02月02日
    浏览(62)
  • 我在VScode学Java类与对象(Java显式参数和隐式参数、静态方法+main方法、Java访问修饰符、static关键字、Java的包、对象数组)第三辑

    我的个人博客主页:如果’\\\'真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习----可以参考我的这篇博客:《我在VScode学Java》 方法会操作对象并访问他们的实例字段。 在Java中,显式参数和隐式参数是方法调用中的两种不同类型的参数。 注释: 第7行: sum 方法的参数

    2024年02月16日
    浏览(96)
  • 【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)

    🌈个人主页:  Aileen_0v0 🔥系列专栏: Java学习系列专栏 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\"   目录 回顾  构造方法  this 面试题 构造方法的类型  下节预告 代码块  之前我们学习了什么是类  什么是对象  什么是面向对象编程 定义类   构造方法 :它的方法名

    2024年02月05日
    浏览(50)
  • Java奠基】实现面向对象编程方法

    目录 标准的JavaBean类 设计对象并使用 对象封装 this 构造方法 要知道对象是一个又一个能帮助我们解决问题的东西,但是这些东西并不是凭空出现的,需要我们根据设计图来进行制造,而这些一个一个的设计图就是一个一个的类。 1)类名需要见名知意 2)成员变量使用

    2024年02月06日
    浏览(47)
  • 【Java】面向对象基础 之 静态字段和静态方法

    在一个class中定义的字段,我们称之为实例字段。实例字段的特点是,每个实例都有独立的字段,各个实例的同名字段互不影响。 还有一种字段,是用static修饰的字段,称为静态字段:static field。 实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共

    2024年02月13日
    浏览(46)
  • C#核心学习(面向对象)

    基本概念: 在实例化对象时,会调用的用于初始化的函数,如果不写,则默认存在一个无参构造函数。 写法: 1、没有返回值 2、函数名和类名必须相同 3、没有特殊需求时,一般是 public 4、构造函数可以被重载 5、this代表当前调用该函数的对象自己 特殊写法 可以通过this 重

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包