final的用法

final 

根据程序上下文环境,Java关键字final这是无法改变的或者终态的含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

final类不能被继承,没有子类,final类中的方法默认是final的。

final方法不能被子类的方法覆盖,但可以被继承。

final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

final不能用于修饰构造方法。

注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

 

1final  

final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。

 

2final方法 

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。

使用final方法的原因有二:

第一、把方法锁定,防止任何继承类修改它的意义和实现。

第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行

例如:

public class TestFinal {

public void f1() {

System.out.println("f1");

}

 

// 无法被子类覆盖的方法

public final void f2() {

System.out.println("f2");

}

 

public void f3() {

System.out.println("f3");

}

 

private void f4() {

System.out.println("f4");

}

}

public class TestFinal2 extends TestFinal {

public void f1() {

System.out.println("Test1父类方法f1被覆盖!");

}

 

public static void main(String[] args) {

TestFinal2 t = new TestFinal2();

t.f1();

t.f2(); // 调用从父类继承过来的final方法

t.f3(); // 调用从父类继承过来的方法

// t.f4(); // 调用失败,无法从父类继承获

}

}

 

3final变量(常量)

final修饰的成员变量表示常量,值一旦给定就无法改变!  

final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。  

从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。  另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。

package testfinal;

 

public class TestFinal4 {

private final String S = "final实例变量S";

private final int A = 100;

public final int B = 90;

public static final int C = 80;

private static final int D = 70;

public final int E; // final空白,必须在初始化对象的时候赋初值

 

public TestFinal4(int x) {

E = x;

}

 

private void test() {

System.out.println(new TestFinal4(1).A);

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

}

 

public void test2() {

final int a; // final空白,在需要的时候才赋值

final int b = 4; // 局部常量--final用于局部变量的情形

final int c; // final空白,一直没有给赋值.

a = 3;

// a=4; 出错,已经给赋过值了.

// b=2; 出错,已经给赋过值了. } }?

}

 

public static void main(String[] args) {

TestFinal4 t = new TestFinal4(2);

// t.A = 101; // 出错,final变量的值一旦给定就无法改变

// t.B = 91; // 出错,final变量的值一旦给定就无法改变

// t.C = 81; // 出错,final变量的值一旦给定就无法改变

// t.D = 71; // 出错,final变量的值一旦给定就无法改变

System.out.println(t.A);

System.out.println(t.B);

System.out.println(t.C); // 不推荐用对象方式访问静态字段

System.out.println(t.D); // 不推荐用对象方式访问静态字段

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

// System.out.println(TestFianl3.E); // 出错,因为E为final空白,依据不同对象值有所不同.

System.out.println(t.E);

TestFinal4 t1 = new TestFinal4(3);

    System.out.println(t1.E); // final空白变量E依据对象的不同而不同 }

}

4final参数

当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。

package testfinal;

 

public class TestFinal3 {

public static void main(String[] args) {

new TestFinal3().f1(2);

}

 

public void f1(final int i) {

// i++;

//i是final类型的,值不允许改变的.

System.out.print(i);

}

}

 

 

final 

根据程序上下文环境,Java关键字final这是无法改变的或者终态的含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

final类不能被继承,没有子类,final类中的方法默认是final的。

final方法不能被子类的方法覆盖,但可以被继承。

final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

final不能用于修饰构造方法。

注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

 

1final  

final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。

 

2final方法 

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。

使用final方法的原因有二:

第一、把方法锁定,防止任何继承类修改它的意义和实现。

第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行

例如:

public class TestFinal {

public void f1() {

System.out.println("f1");

}

 

// 无法被子类覆盖的方法

public final void f2() {

System.out.println("f2");

}

 

public void f3() {

System.out.println("f3");

}

 

private void f4() {

System.out.println("f4");

}

}

public class TestFinal2 extends TestFinal {

public void f1() {

System.out.println("Test1父类方法f1被覆盖!");

}

 

public static void main(String[] args) {

TestFinal2 t = new TestFinal2();

t.f1();

t.f2(); // 调用从父类继承过来的final方法

t.f3(); // 调用从父类继承过来的方法

// t.f4(); // 调用失败,无法从父类继承获

}

}

 

3final变量(常量)

final修饰的成员变量表示常量,值一旦给定就无法改变!  

final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。  

从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。  另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。

package testfinal;

 

public class TestFinal4 {

private final String S = "final实例变量S";

private final int A = 100;

public final int B = 90;

public static final int C = 80;

private static final int D = 70;

public final int E; // final空白,必须在初始化对象的时候赋初值

 

public TestFinal4(int x) {

E = x;

}

 

private void test() {

System.out.println(new TestFinal4(1).A);

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

}

 

public void test2() {

final int a; // final空白,在需要的时候才赋值

final int b = 4; // 局部常量--final用于局部变量的情形

final int c; // final空白,一直没有给赋值.

a = 3;

// a=4; 出错,已经给赋过值了.

// b=2; 出错,已经给赋过值了. } }?

}

 

public static void main(String[] args) {

TestFinal4 t = new TestFinal4(2);

// t.A = 101; // 出错,final变量的值一旦给定就无法改变

// t.B = 91; // 出错,final变量的值一旦给定就无法改变

// t.C = 81; // 出错,final变量的值一旦给定就无法改变

// t.D = 71; // 出错,final变量的值一旦给定就无法改变

System.out.println(t.A);

System.out.println(t.B);

System.out.println(t.C); // 不推荐用对象方式访问静态字段

System.out.println(t.D); // 不推荐用对象方式访问静态字段

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

// System.out.println(TestFianl3.E); // 出错,因为E为final空白,依据不同对象值有所不同.

System.out.println(t.E);

TestFinal4 t1 = new TestFinal4(3);

    System.out.println(t1.E); // final空白变量E依据对象的不同而不同 }

}

4final参数

当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。

package testfinal;

 

public class TestFinal3 {

public static void main(String[] args) {

new TestFinal3().f1(2);

}

 

public void f1(final int i) {

// i++;

//i是final类型的,值不允许改变的.

System.out.print(i);

}

}

 

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爱恨交织的编程语言 是什么吸引了你

摘要:每门编程语言都有自身独特的地方,那么为什么有些语言会一直存活在我们周围,而有些语言却逐渐被人淡忘,是什么吸引你? 每名程序员至少知道两门以上的编程语言,有些甚至不是所谓的编程语言(比…

Unable to parse the date: 2017-12-30 日期格式转化失败

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 报错如题, 日期格式转化失败。 原因:参数是2017-09-23 这种格式,代码却是写的转为: &qu…

linux逻辑卷管理

2019独角兽企业重金招聘Python工程师标准>>> 摘要: Linux用户安装Linux操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小,以分配合适的硬盘空间。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符…

[LeedCode]921. 使括号有效的最少添加

题目描述: 给定一个由 ( 和 ) 括号组成的字符串 S,我们需要添加最少的括号( ( 或是 ),可以在任何位置),以使得到的括号字符串有效。从形式上讲,只有满足下面几点之一,括号字符串才是…

abstract的一些用法

abstract(抽象)修饰符,可以修饰类和方法 1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译…

github 如何设置项目的语言显示

github 会根据一个项目文件最多的那个种类的文件显示为对应的语言项目 如果想让整个项目显示为 HTML 项目, 需要进行以下步骤的设置 1.在根目录下创建一个文件 .gitattributescreate .gitattributes2.在 .gitattributes 内编辑以下内容: *.js linguist-languageHTML…

C++提高进阶,你知道多少?

C从零开始 ——何谓编程 引言 曾经有些人问我问题,问得都是一些很基础的问题,但这些人却已经能使用VC编一个对话框界面来进行必要的操作或者是文档/视界面来实时接收端口数据并动态显示曲线(还使用了多线程技术),却连…

POJ 3352 Road Construction ; POJ 3177 Redundant Paths (双联通)

这两题好像是一样的,就是3177要去掉重边。 但是为什么要去重边呢??????我认为如果有重边的话,应该也要考虑在内才是。 这两题我用了求割边,在去掉割边,用DFS缩…

postman界面变成了左右结构怎么办

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 在左上角 file -- settongs中设置一下:

面向对象阶段个人总结

面向对象阶段的个人总结 我个人对面相对向的总结。我想到了我认为比较好的方法,就是对照每次学习一个大模块的前的章节目录进行回顾总结,比如我们这阶段学习是面向对象的课程,下面我就来按照章节 目录进行一个系统…

1.springboot:入门程序

一、Spring Boot 简介 官网英文: Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. We take an opinionated view of the Spring platform and third-party libraries so you can get st…

2018.12.18运算符,分支结构(循环),异常处理,函数

1复习 <!DOCTYPE html><html><head> <meta charset"UTF-8"> <title>复习预习</title> <style> .b { /* 作用域: {}产生的, {作用域开始的标识, }作用域结束的标识 */ /*出现在作用域中的所有内…

javax.ws.rs.NotSupportedException: Cannot consume content type

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题&#xff1a;javax.ws.rs.NotSupportedException: Cannot consume content type 解决&#xff1a;使用postman发送 post 请求访…

java异常预习

java中的异常捕获结构有try&#xff0c;catch&#xff0c;finally三部分组成。其中&#xff0c;try语句块存放的是可能发生异常的java语句&#xff1b;catch程序块在try语句块之后&#xff0c;用来激发被捕获的异常&#xff1b;finally语句块是异常处理结构的最后执行部分&…

【亲测有效】Kali Linux无法安装网易云音乐的解决方案

问题描述 由于 Kali Linux 的内核是基于 Debian 的&#xff0c;我们在安装网易云音乐的时候更偏向于选择安装网易云音乐 v1.1.0 deepin15&#xff08;64位&#xff09; 的包&#xff0c;可是我发现在安装过程中&#xff0c;无法定位 libqcef1 软件包&#xff0c;对于很多钟爱网…

C/C++函数名修饰约定

函数名字修饰&#xff08;Decorated Name&#xff09;方式 函数的名字修饰&#xff08;Decorated Name&#xff09;就是编译器在编译期间创建的一个字符串&#xff0c;用来指明函数的定义或原型。 正在装载数据…… LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的…

设计模式中类之间的关系

设计模式 个人感觉设计模式是程序员的核心技能 &#xff0c;然后看了一些设计模式的书&#xff0c;都是讲设计模式的一些理论&#xff0c;放在实现上都有点模糊&#xff0c;后来图书馆看到一本《设计模式的艺术》&#xff0c;感觉很不错&#xff0c;有一些比较具体且容易理解的…

如何查看jar包的版本号?

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息&#xff0c;可以到这个文件里查看 打开Java的JAR文件我们经…

JAVA中的toString()方法的用法

toString是Object类的方法&#xff0c;所有类都从Object类继承。如果你定义的类没有覆盖toString方法&#xff0c;则对象在调用toString方法时用的是Object类toString方法&#xff0c;返回的是“类名hashcode". System.out.println(obj)在参数是一个对象时&#xff0c;会首…

kotlin使用spring data jpa(一)

2019独角兽企业重金招聘Python工程师标准>>> 简单查询 spring data jpa是spring全家桶成员之一&#xff0c;用于操作各种数据库&#xff0c;下面写一个查询订单的简单示例 引入sqlserver驱动包及jpa所需包implementation(org.springframework.boot:spring-boot-star…