JAVA语言中的final修饰符

合集下载

修饰符的作用范围

修饰符的作用范围

修饰符的作用范围
修饰符是编程语言中常见的概念,它可以用来限制变量、函数、类等的作用范围。

在编程中,修饰符有着重要的作用,可以帮助程序员更好地管理和控制代码,从而提高程序的可靠性和安全性。

修饰符的作用范围主要分为三个方面:访问控制、继承和多态。

其中,访问控制指的是控制外部代码对成员变量和成员函数的访问权限;继承指的是子类继承父类的属性和方法,从而扩展或修改父类的功能;多态指的是同一方法在不同对象或类中的表现形式不同。

在Java编程中,常用的修饰符包括 public、private、protected、static、final、abstract、synchronized等。

其中,public修饰的成员变量和成员函数可以被任何代码访问,private修饰的成员变量和成员函数只能在本类中被访问,protected修饰的成员变量和成员函数可以在本类和子类中被访问。

在继承中,子类可以通过使用关键字“extends”继承父类的属
性和方法。

此时,父类的修饰符对子类的作用范围也会产生影响。

如果父类的成员变量和成员函数被private修饰,那么子类将无法访问这些成员。

如果父类的成员变量和成员函数被protected修饰,那么子类可以访问这些成员。

在多态中,同一个方法可以被不同的对象或类调用,而表现形式也可能不同。

例如,在面向对象编程中,一个动物类中的eat()方法可以被不同的子类继承并重写,从而表现出不同的吃的方式。

总之,修饰符在编程中扮演着重要的角色,它可以帮助程序员更
好地管理和控制代码,从而提高程序的可靠性和安全性。

程序员应该根据实际需求选择合适的修饰符,并学会灵活运用。

java题库—判断

java题库—判断

第一章:1、CPU指的是运算器和CRT F×2、计算机与一般计算装置的本质区别是它具有存储程序和程序控制功能T*√3、在计算机中,控制器是执行算术运算和逻辑运算的部件,它的任务是对信息进行加工处理。

×4、程序在运行时发现的错误一般是程序语法上的错误。

√*5、第一代计算机时期没有操作系统。

√6、计算机中数值数据一般采用补码形式存储。

√7、利用Java语言可以开发客户端Java小程序和应用程序,以及独立的服务器应用程序等。

√8、Java2技术分为J2EE、J2SE和J2ME,其中J2SE是Java的企业版,用来针对企业级进行应用服务的开发。

×9、Java语言适合开发跨平台的应用程序。

√10、Java语言适合用来开发系统程序,像很多的操作系统及驱动程序都是用Java来编写的。

×11、Java源程序文件扩展名必须为.java,但文件名不必与(主)类名保持一致。

×12、Java的平台无关性主要是依靠JRE实现的。

×13、与Java应用程序(Application)不同,Java Applet程序的运行,需要得到客户端浏览器的支持。

√14、安装JDK时,需要配置环境变量path、classpath和JA V A_HOME。

√第三章:1、J2EE企业版是以企业为环境而开发应用程序的解决方案。

√2、J2ME小型版是致力于消费产品和嵌入式设备的最佳解决方案。

√3、J2SE标准版为桌面开发和低端商务应用提供了可行的解决方案。

√4、Java是区分大小写的语言,关键字的大小写不能搞错,如果把类class写成Class或者CLASS,都是错误的。

√5、Java源程序编写好之后,以文件的形式保存在硬盘或U盘上,源文件的名字可以随便取的,它不一定与程序的主类名一致。

×6、在JDK命令行开发工具中,用编译程序javac.exe编译生成的文件是二进制可执行文件。

java中修饰符的限制范围

java中修饰符的限制范围

java中修饰符的限制范围Java 是一种面向对象的编程语言,其中修饰符是用于限制代码可见性、修饰类、方法、变量等的重要机制。

掌握不同修饰符的限制范围和应用场景对于Java 开发者至关重要。

一、概述Java 修饰符Java 修饰符分为以下几种:1.访问修饰符:用于控制类、方法、变量的可见性,包括public、private、protected 和默认(friendly)四种。

2.非访问修饰符:包括final、volatile、transient、static、synchronized、native、const 和volatile 等。

二、限制范围的作用访问修饰符的限制范围如下:1.public:表示公共的,可以被任何类访问,包括其他包中的类。

2.private:表示私有,只能在本类中访问。

3.protected:表示受保护,可以被以下三种情况访问:a.同一个包中的类。

b.子类(继承关系)。

c.同一个包中的静态方法。

4.default(友好访问符):表示默认访问权限,相当于protected。

可以被同一个包中的类访问,但不能被其他包中的类访问。

三、不同修饰符的应用场景1.访问修饰符:- public:适用于需要与其他类共享的类、方法或变量。

- private:适用于类的内部实现,建议将私有方法设置为final,以防止子类覆盖。

- protected:适用于需要子类继承或扩展的类、方法或变量。

- default:适用于包内访问,但不希望被其他包访问的类、方法或变量。

2.非访问修饰符:- final:表示不可变,适用于常量、方法(防止被子类覆盖)和类(表示类不可继承)。

- volatile:表示变量在多个线程之间的可见性,适用于共享变量。

- transient:表示变量在垃圾回收时的处理,适用于生命周期较短的变量。

- static:表示静态,适用于静态方法、静态变量,以及类的初始化。

- synchronized:表示同步,适用于需要线程安全的方法或代码块。

JAVA语言客观作业及判断题

JAVA语言客观作业及判断题

Java对事件的处理是采用委托方式进行的,即将需要进行事件处理的组件委托给指定的事件处理器进行处理。

答案:正确Java程序是由若干类定义组成的,类定义包括定义类头和定义类体。

答案:正确类的修饰符有静态修饰符static、最终修饰符final、易失修饰符volatile和过度修饰符transient。

答案:错误子类拥有的成员数目大于等于父类拥有的成员数目。

答案:错误Container类的add()方法将GUI组件添加到容器中。

答案:正确Frame,Panel,Apple,Button 4种组件都属于容器组件。

答案:错误在Java中对象可以赋值,只要使用赋值号(等号)即可,相当于生成了一个各属性与赋值对象相同的新对象。

答案:错误在Java的方法中定义一个常量要用const关键字。

答案:错误一个程序里有且只能有一个公共类,它就是主类。

答案:正确最终类不能派生子类。

最终方法不能被覆盖。

答案:正确在Applet中可以调用它的drawImage()方法直接画出一幅图像。

答案:错误一个复选按钮实现的是“二选一”的结构;一个单选按钮实现的是“多选一”的结构。

答案:正确当一个方法在运行过程中产生一个异常,则这个方法会终止,但是整个程序不一定终止运行。

答案:正确当一个方法在运行过程中产生一个异常,则这个方法会终止,但是整个程序不一定终止运行。

答案:正确Final类中的属性和方法都必须被final修饰符修饰。

答案:错误接口是特殊的类,所以接口也可以继承,子接口将继承父接口的所有常量和抽象方法。

答案:正确新创建的Frame视窗对象,会自动显示在屏幕上。

答案:错误Applet可以运行在浏览器中。

答案:正确Java源程序文件应以.java为后缀名保存,文件内包含几个类的定义就编译生成几个对应的字节码文件。

答案:正确类头定义主要说明类的名字、父类名和接口名。

答案:错误为了提高效率,Java中对多次出现的用双引号括起来的字符串字面量只存储一个对象。

java中 static,final,transient,volatile,Volatile关键字的作用

java中 static,final,transient,volatile,Volatile关键字的作用
但是在以下两种场景,不应该使用这种优化方式:
缓存行非64字节宽的处理器(自行调整补充字节长度,原理一样)
共享变量不会被频繁的写。追加字节会导致CPU读取性能下降,如果共享变量写的频率很低,那么被锁的几率也很小,就没必要避免相互锁定了
Volatile无法保证原子性
volatile是一种“轻量级的锁”,它能保证锁的可见性,但不能保证锁的原子性。
由于自增操作是不具备原子性的,它包括读取变量的原始值、进行加1操作、写入工作内存。那么就是说自增操作的三个子操作可能会分割开执行,就有可能导致下面这种情况出现:
假如某个时刻变量inc的值为10,线程1对变量进行自增操作,线程1先读取了变量inc的原始值,然后线程1被阻塞了;然后线程2对变量进行自增操作,线程2也去读取变量inc的原始值,由于线程1只是对变量inc进行读取操作,而没有对变量进行修改操作,所以不会导致线程2的工作内存中缓存变量inc的缓存行无效,所以线程2会直接去主存读取inc的值,发现inc的值时10,然后进行加1操作,并把11写入工作内存,最后写入主存。
如下面的例子
public class Test {
public volatile int inc = 0;
public void increase() {
inc++;
}
public static void main(String[] args) {
追加字节优化Volatile性能
在某些情况下,通过将共享变量追加到64字节可以优化其使用性能。
在JDK 7 的并发包里,有一个队列集合类LinkedTransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能。队里定义了两个共享结点,头结点和尾结点,都由使用了volatile的内部类定义,通过将两个共享结点的字节数增加到64字节来优化效率,具体分析如下:

Java中的final变量、final方法和final类

Java中的final变量、final方法和final类

Java中的final变量、final⽅法和final类Java中的final变量、final⽅法和final类final变量final关键字可⽤于变量声明,⼀旦该变量被设定,就不可以再改变该变量的值。

通常,由final定义的变量为常量。

例如,在类中定义PI值,可以使⽤如下语句:final double PI=3.14;在Java中定义全局常量,通常使⽤public static final修饰,这样的常量只能在定义是被赋值。

public static final double PI_VAULE = 3.14;规范:被定义为final的常量定义时需要使⽤⼤写字母命名,并且中间使⽤下划线进⾏连接。

常量⽰例:import java.util.Random;class Test{int i = 0;}/*** 常量⽰例** @author pan_junbiao**/public class FinalData{static Random rand = new Random();private final int VALUE_1 = 9; // 声明⼀个final常量private static final int VALUE_2 = 10; // 声明⼀个final、static常量private final Test test = new Test(); // 声明⼀个final引⽤private Test test2 = new Test(); // 声明⼀个不是final的引⽤private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 声明⼀个定义为final的数组private final int i4 = rand.nextInt(20);private static final int i5 = rand.nextInt(20);public String toString(){return "i4值:" + i4 + " i5值:" + i5 + " ";}public static void main(String[] args){FinalData data = new FinalData();// 报错:不能改变定义为final的常量值// data.VALUE_1 = 8;// 报错:不能改变定义为final的常量值// data.VALUE_2 = 9;// 报错:不能将定义为final的引⽤指向其他引⽤// data.test = new Test();// 正确:可以对指定为final的引⽤中的成员变量赋值data.test.i = 1;// 正确:可以将没有定义为final的引⽤指向其他引⽤data.test2 = new Test();// 报错:不能对定义为final的数组赋值// int b[] = { 7, 8, 9 };// data.a = b;// 但是final的数组中的每⼀项内容是可以改变的for (int i = 0; i < data.a.length; i++){data.a[i] = 9;}System.out.println(data);System.out.println("data2");System.out.println(new FinalData());}执⾏结果:i4值:5 i5值:8data2i4值:4 i5值:8从上述执⾏结果中可以发现i5的值是相同的。

JAVA多选题

JAVA多选题

1.break ,continue ,return 的区别及作用正确的是(ABCD )A.break 跳出现在的循环块,不再执行循环(结束当前的循环体);B.continue 跳出本次循环,继续执行下次循环(结束正在执行的循环进入下一个循环条件);C.return 程序返回,不再执行下面的代码(结束当前的方法直接返回);D.以上说法都正确;2.以下关于final关键字说法错误的是(AC)A.final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性;B.final修饰的类肯定不能被继承;C.final修饰的方法不能被重载;D.final修饰的变量不允许被再次赋值;3.下面哪些不是java的简单数据类型(BC)A.short;B.Boolean;C.Double;D.float;4.以下哪四个能使用throw抛出(ABCD)A.Error;B.Throwable;C.Exception;D.RuntimeException;5.下列关于静态方法描述正确的是( AC )A.非静态方法中可以调用任何成员;B.静态方法中可以使用this和super区分成员;C.静态方法中只能调用静态成员;D.静态方法只能通过对象进行调用;6.下列关于类和接口的关系说法正确的是( ABD )A.Java中的类与类只能单继承, 可以多层继承;B.Java中的类与接口是实现关系, 一个类可以在继承一个类的同时实现多个接口;C.Java中的接口与接口属于实现关系, 只能单实现;D.Java中的接口与接口属于继承关系, 可以单继承, 也可以多继承;7.关于等待唤醒方法描述正确的是(ACD)A.wait方法调用会导致当前线程释放掉锁资源;B.notify和notifyAll方法调用会导致当前线程释放掉锁资源;C.等待和唤醒的方法,都要使用锁对象调用;D.等待和唤醒方法应该使用相同的锁对象调用;8.下列关于数组和集合描述正确的是( CD )A.数组和集合的长度都是可变的;B.数组只能存储基本数据类型,集合只能存储引用数据类型;C.数组的长度固定,集合的长度可变;D.数组可以存储基本数据类型和引用数据类型, 集合只能存储引用数据类型;9.下列关于增强for循环说法正确的是( ABD )A.增强for循环可以遍历数组也可以遍历单列集合;B.增强for循环没有索引;C.增强for遍历集合, 可以通过集合对象修改集合的长度;D.增强for的底层采用的是迭代器;10.下列关于单列集合体系说法正确的是(ABC)A.List和Set都是属于Collection的子接口;B.ArrayList类属于List接口的实现类;C.HashSet类属于Set接口的实现类;D.LinkedHashMap类属于Collection接口的实现类;11.下列属于Collections工具类中的方法有( ACD )A.shuffle() : 对单列集合进行乱序;B.remove() : 删除集合中的元素;C.sort() : 对单列集合进行排序;D.addAll() : 对单列集合批量添加元素;12.下列对于Map集合的特点说法正确的是( BC )A.所有的双列集合都是无序的;B.键不能重复,值可以重复;C.键和值是一一对应的,通过键可以找到对应的值;D.Map集合键可以重复, 但是值是唯一的;13.下列对于Map集合方法描述正确的是( BCD )A.add() : 添加元素;B.remove() : 根据键删除元素;C.keySet() : 获取键集合;D.containKey() : 判断集合是否存在指定的键;14.下列关于自动装箱和拆箱正确的是( ABCD )A.自动装箱指的是基本数据类型自动转成对应的包装类类型;B.自动拆箱指的是包装类类型自动转成对应的基本数据类型;C.Integer i = 10; // 属于自动装箱;D.Int num = new Integer(“100”); // 属于自动拆箱;15.以下哪些是运行时异常(ABCD)ng.lndexOutOfBoundsException;ng.NullPointerException;C.java.util.ConcurrentModificationException;D.java.time.format.DataTimeParseException;16.以下哪些能够保证线程安全(BC)A.单例模式;B.java.util.Hashtable;C.synchronized;D.volatile;17.以下哪些语句可以正常创建Lock对象(ABD)A.Lock lock = new ReentrantLock(true);B.Lock lock = new ReentrantLock();C.Lock lock = new Lock();D.Lock lock = new ReentrantLock(false);18.对下列运算结果,判断正确的是(AD )A.“1az098”.matches("\d[a-z]{2,8}[0-9]+")结果为true;B.“1az098”.matches("\d[a-z]{2,8}[0-9]+")结果为false;C.“张三,李四,王五,马六,”.split("[,]+").length == 1;该表达式结果返回true;D.“张三,李四,王五,马六,”.split("[,]+").length == 4;该表达式结果返回true19.String str = “We are students”; 下面说法正确的是(AC )A.str的长度是15;B.str的长度是14;C.str.indexOf(“a”)返回的结果是3;stIndexOf(“e”)返回的结果是3;20.下列逻辑表达式,值为false的是(BCD)A.“abc,bcd,def,efg,”.split("[,]+").length == 4;B.“1st456”.matches("\d[a-z&&[^et]]{2,8}[0-9]+");C.“abcdefghijklmnopqrstuvwxyz”.substring(5,26).length() == 20;D.“whatisjava”.equals(null);21.在Java语言中,下列说法正确的是:(ABD)A.StringBuffer和StringBuilder的区别在于:StringBuffer是线程安全的而StringBuilder不是;B.String是不可变对象,而StringBuffer中封装的字符串数据是可以动态改变的;C.判断两个StringBuilder对象的字符序列是否相同,可以调用其equlas方法进行比较;D.String的重写了equals方法,重写的逻辑是:字符序列相同的String对象equals方法返回true;22.关于Java8 Optional的说法正确的是(AB)A.Optional的map()方法,允许改变容器中元素类型B.Optional的filter()方法执行过滤,容器中元素不符合条件,会返回一个空容器C.orElse()方法,会创建默认对象替代容器中元素对象D.Optional.ofNullable()方法中传入空引用变量,将抛出异常23.下列关于Stream流中获取功能有哪些( ACD )A.Collection接口中的默认方法stream()生成流;B.Map接口中的默认方法stream()生成流;C.Arrays中的静态方法stream生成流;D. Stream类中of方法生成流;24.下列关于Stream流中中间功能有哪些( ABC )A.filter()方法用于对流中的数据进行过滤;B.sorted()方法将流中元素进行排序;C.limit()方法截取指定参数个数的数据D.collector()方法收集流中的数据;25.下列关于Stream流中终结功能有哪些((ABD )A.forEach()方法对流中的元素遍历;B.count()方法返回此流中的元素数;C.skip()方法跳过指定参数个数的数据;D.collector()方法收集流中的数据;26.按照学生平均成绩(avg_grade) 将students表中的数据检索出来,下面SQL语句正确的是(ACD)A.SELECT * FROM students ORDER BY avg_grade;B.SELECT * FROM students GROUP BY avg_grade ASC;C.SELECT * FROM students ORDER BY avg_grade DESC;D. SELECT * FROM students ORDER by avg_grade asc27.下列索引定义不符合规范的是(CD)A.uniq_order_idB.idx_user_ider_id_order_idD.idx_a_b_c_d_e_f28.下面有关sql 语句中delete、truncate的说法正确的是(AC)A.论清理表数据的速度,truncate一般比delete更快;B.truncate命令可以用来删除部分数据;C.truncate只删除表的数据不删除表的结构;D.delete能够回收高水位(自增ID值);29.在SQL中语法规范中,having子句的使用下面描述正确的是(AC)A.having子句即可包含聚合函数作用的字段也可包括普通的标量字段使用having的同时不能使用where子句;B.having子句必须于group by 子句同时使用,不能单独使用使用having子句的作用是限定分组条件;C.having子句和where子句是等同的;D.having子句后面必须使用聚合函数;30.下列中属于MyBatis全局配置文件中的标签是(ACD)A.settings;B.select;C.plugins;D.properties;31.在MyBatis 动态SQL 中,循环使用的标签名不正确的是(ABD)A.for;B.while;C.foreach;D.do-while;32.关于MyBatis传递数组参数的说法正确的是(ABD)A.在映射文件中取得数组值应该通过< forEach>标签;B.< forEach>标签可以应用于set、List以及数组的取值;C.传递数组的值,和多参数传值一样在映射文件中只能通过< forEach>取值;D.< forEach>标签的open和close属性用于写开始和结束标签;33.对mybatis描述有误的是(CD)A.MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架;B.MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在session 里面;C.Mybatis是一个全ORM(对象关系映射)框架,它内部封装了JDBC;D.MyBatis 只可以使用XML来配置和映射原生信息;34.Mybatis是如何将sql执行结果封装为目标对象并返回的(BC)A.id;B.< resultMap>标签;C.使用sql列的别名;D.resultType;35.mybaties中模糊查询like语句的写法(AD)A.select * from foo where bar like #{value}B.select * from foo where bar like #{%value%}C.select * from foo where bar like %#{value}%D.select * from foo where bar like “%”${value}"%"36.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?选择说法正确的(AB)A.不同的Xml映射文件,如果配置了namespace,那么id可以重复;B.如果没有配置namespace,那么id不能重复C.如果没有配置namespace,id能重复D.不同的Xml映射文件,如果配置了namespace,那么id不可以重复37.Mybatis的mapper接口调用时候的要求正确的是(ABC)A.Mapper接口方法名和Mapper.xml中定义的每个SQL的id相同B.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sqlparameterType类型相同C.Mapper接口方法的输入输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同D.Mapper.xml文件中的namespace,就是接口的名字38.MyBatis内置类型别名有那些(AC)A._int;B.Integer;C.Int;D.String;39.Mybatis动态sql标签有哪些(ABC)A.trim;B.foreach;C.set;D.than40.实体类中的属性名和表中的字段名不一样怎么处理(AC)A.查询的sql语句中定义字段名的别名;B.不用处理;C.通过< resultMap>来映射字段名和实体类属性名;D.通过< resultType>来映射字段名和实体类属性名;41.关于MyBatis参数处理说法正确的是(BC)A.传递单个参数时,MyBatis会自动封装到Map集合中;B.传递单个参数时,MyBatis会自动进行参数的赋值;C.传递多个参数时,MyBatis会自动封装到Map集合中;D.传递多个参数时,MyBatis会自动进行参数的赋值;42.@SpringBootApplication注解是一个组合组件,下面是属于它的有(ACD)A.ConfigurationB.ControllerC.EnableAutoConfigurationpontScan43.以下哪些是SpringBoot默认支持自动装配的(ABC)A.spring-boot-starter-webB.spring-boot-starter-data-redisC.spring-boot-starter-securityD.mybatis-spring-boot-starter44.下面关于SpringBoot启动说明正确的是(BCD)A.SpringBoot项目启动就会加载bootstrap.properties文件B.SpringBoot项目启动会加载所有的在spring.factories中配置的监听器C.SpringBoot项目启动的时候会发布相关事件,从而会触发对应的监听器来完成对应的操作D.SpringBoot项目启动本质上就是Spring的初始化操作45.SpringBoot读取配置相关注解有(ABCD)A.@PropertySourceB.@ValueC.@EnvironmentD.@ConfigurationProperties46.Spring Boot 里面,可以使用以下哪几种方式来加载配置(ABCD)A.properties文件;B.YAML文件;C.系统环境变量;D.命令行参数;47.Dubbo集群提供了哪些负载均衡策略(ABCD)A.Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重;B.RoundRobin LoadBalance: 轮循选取提供者策略;C.LeastActive LoadBalance: 最少活跃调用策略;D.ConstantHash LoadBalance: 一致性Hash 策略;48.Dubbo 核心组件有哪些(ABCD)A.Provider:暴露服务的服务提供方;B.Consumer:调用远程服务消费方;C.Registry:服务注册与发现注册中心;D.Monitor:监控中心和访问调用统计;49.下列哪些是SpringBoot数据源的配置项(ABC)A.spring.datasource.url=jdbc:mysqI://127.0.0.1:3306/news?useUnicode=true&characterEncoding=utf8;ername=root;C.spring.datasource.password=pwd;D.spring.datasource.driver-class =com.mysql.jdbc.Drive50.Spring Boot有哪些优点(BCD)A.完全没有代码生成和xml配置文件;B.使用JavaConfig有助于避免使用XML;C.避免大量的Maven导入和各种版本冲突;D.通过提供默认值快速开始开发。

final修饰基本类型和引用类型-概述说明以及解释

final修饰基本类型和引用类型-概述说明以及解释

final修饰基本类型和引用类型-概述说明以及解释1.引言1.1 概述在Java编程语言中,我们经常会使用final关键字来修饰变量和方法。

在本篇文章中,我们将探讨final关键字在修饰基本类型和引用类型上的作用和影响。

final修饰符的主要作用是使变量或方法成为不可变的,也就是说它们的值或定义不能被修改。

对于基本类型和引用类型,final关键字的使用方式稍有不同,因此我们将分别讨论它们的不可变性和final关键字对它们的影响。

在接下来的章节中,我们将首先介绍基本类型的不可变性。

然后,我们将探讨final关键字的使用方法,包括如何声明和初始化final变量。

接着,我们将转向引用类型的不可变性,并讨论final关键字对引用类型的影响。

最后,我们将总结基本类型和引用类型的final修饰,总结各自的特点和应用场景。

同时,我们还会探讨未来可能的研究方向,以进一步深化我们对final修饰的理解。

通过本文的阅读,读者将能够全面了解final修饰基本类型和引用类型的特点和用法,进一步提升自己的Java编程能力。

让我们开始探索final 修饰的不可变性的奥秘吧!1.2文章结构1.2 文章结构本文将分为三个主要部分来探讨final关键字在修饰基本类型和引用类型时的使用和影响。

第一部分是引言,主要包括概述、文章结构和目的。

在概述中,我们将简要介绍final关键字以及其在Java中的作用。

文章结构将指导读者对文章的整体结构进行了解,以便更好地理解后续的内容。

而文章的目的则是明确我们撰写本文的目标,即探讨final修饰基本类型和引用类型的具体细节。

第二部分是正文,包含两个小节:final修饰基本类型和final修饰引用类型。

在2.1节中,我们将详细讨论final修饰基本类型的作用与特点。

首先,我们将解释基本类型的不可变性,即一旦被赋予了初值,它们将无法被修改。

接着,我们将探讨final关键字在修饰基本类型时的具体使用方法和语法规则。

提高java性能的26个细节

提高java性能的26个细节

Java编程中“为了性能”需做的26件事2012-06-01 11:34最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。

下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。

1.尽量在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:∙控制资源的使用,通过线程同步来控制资源的并发访问;∙控制实例的产生,以达到节约资源的目的;∙控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。

2.尽量避免随意使用静态变量要知道,当某个对象被定义为stataic的变量所引用,那么GC通常是不会回收这个对象所占有的内存,如public class A{ static B b = new B();} 此时静态变量b的生命周期与A类同步,如果A 类不会卸载,那么b对象会常驻内存,直到程序终止。

3.尽量避免过多过常的创建Java对象尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。

4.尽量使用final修饰符带有final修饰符的类是不可派生的。

在Java核心API中,有许多应用final的例子,例如ng.String。

为String类指定final防止使用者覆盖length()方法。

另外,如果一个类是final的,则该类所有方法都是final的。

Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。

此举能够使性能平均提高50%。

5.尽量使用局部变量调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。

修饰符的作用范围

修饰符的作用范围

修饰符的作用范围修饰符在编程语言中是用来修饰变量、方法或类的关键词,用于控制其作用范围或访问权限。

在本文中,我们将探讨修饰符的作用范围,并分别从变量、方法和类的角度进行讨论。

一、变量的修饰符作用范围在编程中,变量是用来存储数据的容器。

变量的修饰符可以控制其作用范围或访问权限。

常见的变量修饰符有public、private、protected和default(即没有明确修饰符)。

public修饰符表示变量可以被任何类访问,无论是同一个包中的类还是其他包中的类。

private修饰符表示变量只能被同一个类中的其他方法访问,其他类无法直接访问。

protected修饰符表示变量可以被同一个包中的其他类访问,以及其他包中的继承了该类的子类访问。

default修饰符表示变量可以被同一个包中的其他类访问,但对其他包中的类是不可见的。

二、方法的修饰符作用范围方法是一段可重复使用的代码,用于执行特定的功能。

方法的修饰符可以控制其作用范围或访问权限。

常见的方法修饰符有public、private、protected和default。

public修饰符表示方法可以被任何类访问,无论是同一个包中的类还是其他包中的类。

private修饰符表示方法只能被同一个类中的其他方法访问,其他类无法直接访问。

protected修饰符表示方法可以被同一个包中的其他类访问,以及其他包中的继承了该类的子类访问。

default修饰符表示方法可以被同一个包中的其他类访问,但对其他包中的类是不可见的。

三、类的修饰符作用范围类是一种封装了数据和方法的抽象数据类型。

类的修饰符可以控制其作用范围或访问权限。

常见的类修饰符有public、final、abstract 和default。

public修饰符表示类可以被任何类访问,无论是同一个包中的类还是其他包中的类。

final修饰符表示类不能被继承,即不能有子类。

abstract修饰符表示类不能被实例化,只能作为父类被其他类继承。

联想java面试题

联想java面试题

联想java面试题1. 引言Java作为一门广泛应用于软件开发领域的编程语言,已成为许多公司面试过程中的重要考察要素。

本文将介绍一些常见的联想Java面试题,旨在帮助读者更好地准备面试。

2. Java基础知识2.1 什么是Java虚拟机(JVM)?Java虚拟机(Java Virtual Machine)是Java运行环境的一部分,它负责解释和执行Java字节码,并提供了内存管理、垃圾回收等功能。

2.2 Java中的四个访问修饰符分别是什么?Java中的四个访问修饰符分别是public、protected、default(默认,不用关键字修饰)和private。

它们用于控制类、方法、变量的访问权限。

2.3 什么是Java中的关键字final和finally?关键字final应用于类、方法和变量,用于表示它们是最终的,不可继承、重写或修改。

关键字finally用于定义一个代码块,其中的代码无论是否发生异常都会被执行,通常用于释放资源或进行清理操作。

3. Java面向对象3.1 面向对象的特征有哪些?面向对象的特征包括封装、继承和多态。

- 封装(Encapsulation)将数据和方法封装在一个类中,以达到保护数据、隐藏实现的目的。

- 继承(Inheritance)允许一个类继承另一个类的属性和方法,实现代码的重用性和扩展性。

- 多态(Polymorphism)指对象可以根据具体的类型表现出不同的行为,提高代码的灵活性和可扩展性。

3.2 接口和抽象类有什么区别?接口(Interface)是一种完全抽象的类,它只定义了方法的签名,没有实现。

一个类可以实现多个接口。

抽象类(Abstract Class)是一个只能被继承的类,它可以包含抽象方法和非抽象方法。

一个类只能继承一个抽象类。

4. Java集合框架4.1 Java集合框架的主要接口有哪些?Java集合框架的主要接口有List、Set、Map和Queue等。

可以重写final修饰方法

可以重写final修饰方法

可以重写final修饰方法在Java编程语言中,final关键字通常用于修饰类、方法和变量。

当final关键字用于修饰方法时,表示该方法是不可重写的。

也就是说,子类不能对该方法进行重写或覆盖。

本文将探讨final修饰方法的作用、使用场景以及相关注意事项。

final修饰方法的作用是为了防止子类对该方法的修改。

在某些情况下,父类的某个方法已经经过精心设计和实现,不希望子类对其进行修改,以保证系统的稳定性和安全性。

通过使用final修饰方法,可以确保该方法在子类中保持一致的行为。

这种设计方式可以避免子类在继承父类时对方法的误用或滥用,提高代码的可靠性和可维护性。

final修饰方法的使用场景有多种。

一种常见的情况是,当一个类被声明为final时,其中的所有方法都会自动成为final方法。

这样做是为了确保整个类的行为不会被子类修改。

另外,当父类中的某个方法已经足够完善和稳定,不需要子类进行修改时,也可以将该方法声明为final。

这样一来,子类无法对该方法进行重写,从而保证了系统的稳定性。

使用final修饰方法还可以提高程序的执行效率。

由于final方法在编译时被绑定到调用的位置,因此可以避免动态绑定的开销。

这对于频繁调用的方法来说,可以节省一定的执行时间。

然而,需要注意的是,final修饰方法并不意味着该方法不能被重载。

在Java中,方法的重载是指在同一个类中定义多个同名但参数列表不同的方法。

因此,即使方法被final修饰,仍然可以在同一个类中定义其他同名但参数不同的方法。

这是因为重载方法的签名不同,所以不会产生冲突。

还需要注意final修饰方法与private修饰方法之间的区别。

private 修饰的方法只能在当前类中访问,而final修饰的方法则可以在子类中访问。

因此,如果想要限制方法的访问范围,应该使用private 修饰符而不是final修饰符。

final修饰方法是为了防止子类对方法的修改,从而保证系统的稳定性和安全性。

java笔试——选择题

java笔试——选择题

Java基础笔试题一.选择题(共50题,每题2分,共100分。

多选题选不全或选错都不得分。

)1.以下属于面向对象的特征的是(C,D)。

(两项)A) 重载B) 重写C) 封装D) 继承2.以下代码运行输出是(C)public class Person{private String name=”Person”;int age=0;}public class Child extends Person{public String grade;public static void main(String[] args){Person p = new Child();System.out.println();}}A) 输出:Person B) 没有输出C) 编译出错D) 运行出错解答:子类不能访问父类私有成员3.在使用super 和this关键字时,以下描述正确的是(A)A) 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过B) super()和this()不一定要放在构造方法内第一行C) this()和super()可以同时出现在一个构造函数中D) this()和super()可以在static环境中使用,包括static方法和static语句块4.以下对封装的描述正确的是(D)A) 只能对一个类中的方法进行封装,不能对属性进行封装B) 如果子类继承了父类,对于父类中进行封装的方法,子类仍然可以直接调用C) 封装的意义不大,因此在编码时尽量不要使用D) 封装的主要作用在于对外隐藏内部实现细节,增强程序的安全性5.以下对继承的描述错误的是(A)A) Java中的继承允许一个子类继承多个父类B) 父类更具有通用性,子类更具体C) Java中的继承存在着传递性D) 当实例化子类时会递归调用父类中的构造方法6.以下程序的运行结果是(D)class Person{public Person(){System.out.println(“this is a Person”);}}public class Teacher extends Person{private String name=”tom”;public Teacher(){System.out.println(“this is a teacher”);super();}public static void main(String[] args){Teacher teacher = new Teacher();System.out.println();}}A) this is a Personthis is a teachertomB) this is a teacherthis is a PersontomC) 运行出错D) 编译有两处错误7.以下说法错误的是(D)A) super.方法()可以调用父类的所有非私有方法B) super()可以调用父类的所有非私有构造函数C) super.属性可以调用父类的所有非私有属性D) this和super关键字可以出现在同一个构造函数中8.以下关于final关键字说法错误的是(A,C)(两项)A) final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性B) final修饰的类肯定不能被继承C) final修饰的方法不能被重载D) final修饰的变量不允许被再次赋值9.访问修饰符作用范围由大到小是(D)A) private-default-protected-public B) public-default-protected-private C) private-protected-default-public D) public-protected-default-private 10.以下(D)不是Object类的方法A) clone()B) finalize()C) toString()D) hasNext()11.多态的表现形式有(A)A) 重写B) 抽象C) 继承D) 封装12.以下对重载描述错误的是(B)A) 方法重载只能发生在一个类的内部B) 构造方法不能重载C) 重载要求方法名相同,参数列表不同D) 方法的返回值类型不是区分方法重载的条件13.以下(D)添加到ComputerBook中不会出错class Book{protected int getPrice(){return 30;}}public class ComputerBook extends Book{}A) protected float getPrice(){}B) protected int getPrice(int page){}C) int getPrice(){}D) public int getPrice(){return 10;}14.以下对抽象类的描述正确的是(C)A) 抽象类没有构造方法B) 抽象类必须提供抽象方法C) 有抽象方法的类一定是抽象类D) 抽象类可以通过new关键字直接实例化15.以下对接口描述错误的有(D)A) 接口没有提供构造方法B) 接口中的方法默认使用public、abstract修饰C) 接口中的属性默认使用public、static、final修饰D) 接口不允许多继承16.以下代码,描述正确的有(A)interface IDemo{public static final String name;1void print();2public void getInfo();3}abstract class Person implements IDemo{4public void print(){}}A) 第1行错误,没有给变量赋值B) 第2行错误,方法没有修饰符C) 第4行错误,没有实现接口的全部方法D) 第3行错误,没有方法的实现17.接口和抽象类描述正确的有(B,C)(两项)A) 抽象类没有构造函数B) 接口没有构造函数C) 抽象类不允许多继承D) 接口中的方法可以有方法体18.以下描述错误的有(C)A) abstract 可以修饰类、接口、方法B) abstract修饰的类主要用于被继承C) abstract 可以修饰变量D) abstract修饰的类,其子类也可以是abstract修饰的19.以下描述正确的有(B)A) 方法的重写应用在一个类的内部B) 方法的重载与返回值类型无关C) 构造方法不能重载D) 构造方法可以重写20.以下程序运行结果是(A)public class Test extends Father{private String name=”test”;public static void main(String[] args){Test test = new Test();System.out.println(test.getName());}}class Father{private String name=”father”;public String getName() {return name;}}A) father B) test C) 编译出错D) 运行出错,无输出21.以下对异常的描述不正确的有(C)A) 异常分为Error和Exception B) Throwable是所有异常类的父类C) Exception是所有异常类父类D) Exception包括RuntimeException和RuntimeException 之外的异常22.在try-catch-finally语句块中,以下可以单独与finally一起使用的是(B)A) catch B) try C) throws D) throw23.下面代码运行结果是(B)public class Demo{public int add(int a,int b){try{return a+b;}catch(Exception e){System.out.println(“catch 语句块”);}finally{System.out.println(“finally 语句块”);}return 0;}public static void main(String[] args){Demo demo = new Demo();System.out.println(“和是:”+demo.add(9,34));}}A) 编译异常B) finally语句块和是:43C) 和是:43 finally语句块D) catch语句块和是:4324.以下描述不正确的有(D)A) try块不可以省略B) 可以使用多重catch块C) finally块可以省略D) catch块和finally块可以同时省略25.以下对自定义异常描述正确的是(C)A) 自定义异常必须继承Exception B) 自定义异常可以继承自ErrorC) 自定义异常可以更加明确定位异常出错的位置和给出详细出错信息D) 程序中已经提供了丰富的异常类,使用自定义异常没有意义26.以下程序运行结果是(D)public class Test {public int div(int a, int b) {try {return a / b;}catch(Exception e){System.out.println(“Exception”);}catch(NullPointerException e){System.out.println(“ArithmeticException”);}catch (ArithmeticException e) {System.out.println(“ArithmeticException”);} finally {System.out.println(“finally”);}return 0;}public static void main(String[] args) {Test demo = new Test();System.out.println(“商是:” + demo.div(9, 0));}}A) Exception finally 商是:0 B) ArithmeticException finally 商是:0C) finally商是:0 D) 编译报错27. 以下对TCP和UDP描述正确的是(D)A) TCP不能提供数据的可靠性B) UDP能够保证数据库的可靠性C) TCP数据传输效率高于UDP D) UDP数据传输效率高于TCP28. 在Java中,下面对于构造函数的描述正确的是(D)。

电大Java语言与WWW技术形成性考核判断题

电大Java语言与WWW技术形成性考核判断题

电大Java语言与WWW技术形成性考核判断题1、()用户自定义的图形界面元素也可以响应用户的动作,具有交互功能。

2、()容器是用来组织其他界面成分和元素的单元,它不能嵌套其他容器。

3、()Java的屏幕坐标是以像素为单位,容器的左下角被确定为坐标的起点。

6、()所有的鼠标事件都由MouseListener监听接口的监听者来处理。

7、()Menu 表示菜单,Label表示按钮。

8、()一个容器中可以混合使用多种布局策略。

9、()Java Applet是由独立的解释器程序来运行的。

10、()容器可以使用add( )方法放置组件1、Java语言有三种技术平台,分别是JavaSE、JavaME、JavaEE(T)2、Java是一门高级计算机语言。

(T)3、Java语言具体跨平台的特性(T)4、JDK工具中自带了一个JRE工具(T)5、JDK安装的时候不可以修改安装目录(F)6、JDK的安装目录中,只包含bin和lib两个目录。

(F)7、javac命令可以运行文件(F)8、在任意命令行窗口中执行javac命令,如果都能正常地显示帮助信息,说明系统path环境变量配置成功。

(T)9、JDK安装成功后,可以将bin目录的路径配置在环境变量path中。

(T)10、JDK5以后可以不用配置classpath环境变量。

(T)11、配置classpath环境变量时,路径后面加分号与不加分号是一样的。

(F)12、main()函数是java程序的执行入口。

(T)13、数组的遍历是指依次访问数组中的每个元素(T)14、continue 语句只用于循环语句中,它的作用是跳出循环。

(F)15、continue语句用在循环语句中,它的作用是终止本次循环,执行下一次循环(T)16、数组的排序算法只有冒泡排序这一种(F)17、方法的返回值类型可以定义也可以不定义(F)18、比较运算符用于对两个数值或变量进行比较,其结果是一个布尔值(T)19、若x = 5,则表达式(x + 5)/3的值是3(T)20、标识符可以为关键字(F)21、-5%3的运算结果是2(F)22、0xC5表示的是一个十六进制整数。

Wrapper类 final类

Wrapper类   final类

包装类(Wrapper类)
Java中许多存储和管理对象集合的有用的类(列表、 树、数组等)不能在这些基本类型上进行操作,因为 从技术上讲这些基本类型不是从Java对象类派生出 来的。 但是Java为基本类型提供包装类,这使得任何接受 对象的操作也可以用来操作基本类型。 直接将简单类型的变量表示为一个类,在执行变量类 型的相互转换时,我们会大量使用这些包装类。 Java的基本数据类型对应八个包装类,分别是 Boolean、Short、Byte、Character、Integer、 Long、Float和Double。除了首字母大写之外,包装 类与基本类型名字相似。

包装类的构造方法:
(2)除Character类以外,其他的包装类都
可以以一个字符串为参数来构造他们的实例。 (3)当Boolean类的构造方法的参数为 String类型时,如果该字符串的内容为 ture(不考虑大小写),则该Boolean对象表示 为ture,否则表示为false. (4)当Byte\Short\Integer\Long\Float 和Double类的构造方法的参数为String类 型时,字符串不能为null,并且该字符串必 须可以解析为相应的基本类型的数据。否则 虽然编译通过,但运行时还是会抛出异常。
System.out,println(s); } }




则运行结果即为 黄色
包装类(Wrapper类)

Java是一种面向对象语言,java中的类把方法与数 据连接在一起,并构成了自包含式的处理单元。但在 Java中不能定义基本类型(primitive type),为了能 将基本类型视为对象来处理,并能连接相关的方法, Java为每个基本类型都提供了包装类,这样,我们 便可以把这些基本类型转化为对象来处理了。这些包 装类有:Boolean、Byte、Short、Character、 Integer等。值得说明的是,java是可以直接处理基 本类型的,但是在有些情况下我们需要将其作为对象 来处理,这时就需要将其转化为包装类了。

java填空题

java填空题

填空题1. (Class)是Java的关键字用来定义类。

2. Java语言中,(.Object)类是所有类的根类。

3. 声明并创建类MyClass的一个对象,其名称为obj,实现语句(Myclass obj=new myclass())。

4. 若x=5,y=10 则x<=y的逻辑值是(true )。

5.带有(final)修饰符的类称为最终类6.Java的(垃圾回收)机制大大减轻了程序员的负担,不用再编写专门的内存回收程序解决内存分配问题,不仅提高了编程效率,而且进一步增强了Java程序的稳固性。

7.如果类的设计要求它的某个成员变量不能被外部类直接访问。

应该使用(Static)修饰符获得需要的访问控制。

8.有如下语句:String str="a short string";String s1=str.substring (8,14);则s1=(string)9.Java 不直接支持多继承,但可以通过( 接口 )实现多继承。

10.String 类是否可以继承。

(否)18. Java用( extends )关键字指明继承关系。

20. Java程序在extends之后只能有一个父类,即extends只能实现( 单 )继承。

30. Java中子类通过关键字( super)来实现对父类成员的访问.31.在Java程序中,通过类的定义只能实现( 单 )重继承,但通过接口的定义可以实现( 多 )重继承关系。

32.如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyAppletClass,则类MyAppletClass必须是( Applet )类的子类并且存储该源程序文件的文件名为( MyAppletClass(.java) )。

33. 设x = 2 ,则表达式 (++x)*3%9 的值是( 0 )。

34. 若x=50,y=100则x>=y的逻辑值是( false )。

Java语言程序设计期末复习综合练习题

Java语言程序设计期末复习综合练习题

Java语言程序设计期末复习综合练习题一、判断题1.Java程序里,创建新的类对象用关键字new,回收无用的类对象使用关键字free。

( 错) 2.有的类定义时可以不定义构造函数,所以构造函数不是必需的。

( 错)3.类及其属性、方法可以同时有一个以上的修饰符来修饰。

( 对)4.Java的屏幕坐标是以像素为单位,容器的左下角被确定为坐标的起点( 错)5.抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法。

(错)6.Final类中的属性和方法都必须被final修饰符修饰。

( 错)7.最终类不能派生子类,最终方法不能被覆盖。

( 对)8.子类要调用父类的方法,必须使用super关键字。

(对)9.一个Java类可以有多个父类。

(错)10.如果p是父类Parent的对象,而c是子类Child的对象,则语句c = p是正确的。

( 错) 11.一个类如果实现了某个接口,那么它必须重载该接口中的所有方法。

( 对)12.当一个方法在运行过程中产生一个异常,则这个方法会终止,但是整个程序不一定终止运行。

(对)13.接口是特殊的类,所以接口也可以继承,子接口将继承父接口的所有常量和抽象方法。

(对)14.用“+”可以实现字符串的拼接,用- 可以从一个字符串中去除一个字符子串。

(错) 15.一个容器中可以混合使用多种布局策略。

(错)16.一个线程对象的具体操作是由run()方法的内容确定的,但是Thread类的run()方法是空的,其中没有内容;所以用户程序要么派生一个Thread的子类并在子类里重新定义run()方法,要么使一个类实现Runnable接口并书写其中run()方法的方法体。

( 对)17.Java的源代码中定义几个类,编译结果就生成几个以.class为后缀的字节码文件。

(对) 18.Java Applet是由独立的解释器程序来运行的。

(对)19.Java Applet只能在图形界面下工作。

(对)20.Java的字符类型采用的是ASCII编码。

java final修饰符

java  final修饰符
final class finals
{
final String str=&# str1="non final data" ;
final public void print()
{
System .out.println("final method." );
}
public void what()
{
System .out.println(str+"\n" +str1);
}
}
public class FinalDemo//extendsfinals无法继承
{
public static void main(String[] args)
{
finals f = new finals( );
java
final关键字表示对象是最终形态,对象是不可改变的意思。final在应用于类、方法和变量时意义不同,但本质一样:final表示不可改变。用在变量的前面表示变量的值不可以改变,此时该变量可以被称为常量。用在方法的前面表示方法不可以被重写,用在类的前面表示类不可以被继承,即该类是最终形态,只可以使用,如常见的ng.String类。
f.what( );
f.print( );
}
}
从上述代码中可以看出,final类与普通类的使用几乎没有差别,只是它失去了被继承的特性。执行结果如图6-21所示。
图6-21执行结果
将方法声明为final,说明这个方法提供的功能已经满足当前要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆这个方法。但仍然可以继承这个方法,即可以直接使用。
2.final类
当将final用于类身上时就需要仔细考虑,因为一个final类无法被任何其他类继承,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final类型。示例代码如下所示:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//final 修饰数组变量,iArr 是一个引用变量 final int[] iArr = {5,6,12,9}; System.out.println(Arrays.toString(iArr)); // 这时要导入 java.util

//对数组元素进行排序,合法 Arrays.sort(iArr); System.out.println(Arrays.toString(iArr));
//既没有指定默认值,又没有在初始化块,构造器中指定初始值,下面定义 char 属性是不合法
//final char ch;
//初始化块,要对没有指定默认值的实例属性指定初始值 {
str = "Hello";
语句非法
//定义 a 属性时,已经指琯了默认值,不能为 a 重新赋值,下面赋值
//a = 9; }
在上面程序中父类是 TestFinalMethod ,该类里定义的 test 方法是一个 final 方法,如果 其子类试图重写该方法,将会引发编译错误。
对一个 private 方法,因为它仅在当产类中可见,其子类无法访问该方法,所以子 类无法重写该方法----如果子类中定义一个与父类 private 方法有相同方法名,相同形参列表, 相同返回值类型的方法,也不是方法重写,只是重新定义了一个新方法。因此即使使用 final 修饰一个 private 访问权限的方法,依然可以在其子类中定义与该方法具有相同方法名,相 同形参列表,相同返回值类型的方法。
static {
//在静态初始化块中为类属性指定初始值,全法 d = 5.6;
}
//在构造器,可对没有指定默认值,且没有在初始化块中指定初始值的实例 属性指定初值
public TestFinalVariable()
{
重新赋值
//如果初始化块中对 str 指定了初始值,构造器中不能对 final 变量
//下面赋值语句非法 //str ="java";
//定义 final 局部变量时没有指定默认值,则 d 变量可被赋值一次 final double d;
//第一次赋初始值,成功
d = 5.6;
//对 final 变量重复赋值,下面语句非法 //d = 3.4;
} }
上面程序中还写到了 final 修饰形参的情形:因为形参在调用该方法时,由系统根据传入的 参数来完成初始化,因此使用 final 修饰的形参不能被赋值。
因为 final 变量获得初始值之后不能被重新赋,因此 final 修饰成员变量和修饰局部 变量时有一定的不同:下面我将会写到有哪些方面的不同,还有就是为什么会不同。
final 修饰成员变量
成员变量是随类初始化或对象初始化而初始化的。当类初始化时,系统会为该类属 性分配内存,并分配默认值;当创建对象时,系统会为该对象的实例属性分配内存,并分配 默认值。也就是说,当执行静态初始化块时可以对类属性赋初始值,当执行普通初始块,构 造器时可对实例属性赋初始值。因此,成员变量的初始值可以在定义该变量时指定默认值, 可以在初始化块,构造器中指定初始值,否则,成员变量的初始值将是由系统自动分配的初 始值。
//设置调用对象的年龄
{
this.age= age;
}
public int getAge() {
return this.age; }
//返回调用对象的年龄
}
public class FinalReferenceTest {
public static void main(String[] args) {
修饰局部变量时既可以在定义时指定默认值,也可以不指定默认值。
如果 final 修饰的局部变量在定义时没有指定默认值,则可以在后面代码中进行对该 final 变量赋初始值,但只能一次,不能重复赋值:如果 final 修饰的局部变量在定义时已经 指定默认值,则后面代码中不能财对该变量赋值。
看代码:
public class TestFinalLocalVariable
class Person {
private int age; public Person() {}
//有参数构造器 public Person(int age) { this.age = age; }
//age 属性的 setter 和 getter 方法
public void setAge(int age)
因此当使用 final 修饰成员变量的时候,要么在定义成员变量时候指定初始值,要么
在初始化块,构造器中为成员变量赋初始值,如果在定义该成员变量时指定了默认值,则不 能在初始化块,构造器中为该属性生新赋值,归纳起来,final 修改的类属性,实例属性能 指定初始值的地方如下: 》类属性,可在静态初始化块中,声明该属性时指定初始值。
final 修饰基本类型和引用类型的区别:
当使用 final 修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不 能被改变,但对于引用类型的变量而言,它保存的仅仅是一个引用,final 只保证这个引用 所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。
看代码:
import java.util.*;
TestFinalVariable tf = new TestFinalVariable();
System.out.println(tf.a); System.out.println(tf.c);
System.out.println(tf.d);
}
}
程序编译结果:
上面程序详细示范了初始化成员变量的各种情形。
//下面语句对 P 重新赋值,非法 P= null;
从程序中可以看出,使用 final 修饰的引用类型变量不能被重新赋值,但可以改变引用型变 量所引用的内容,例如上面 iArr 变量所引用的数组对象,final 修饰后的 iArr 变量不能被重 新赋值,但 iArr 所引用数组的数组元素可以被改变。与此类似的是,P 变量也使用了 final 修饰,表明 P 变量不能被重新赋值,但 P 变量所引用 Person 对象的属性可以改变。
//对数组元素赋值,合法 iArr[2] = -8; System.out.println(Arrays.toString(iArr));
//下面语句对 iArr 重新赋值,非法 iArr = null;erson 变量,P 是一个引用变量 final Person p = new Person(45); //改变 Person 对象 的 age 属性,合法 P.setAge(23); System.out.println(p.getAge());
对于 final 修饰的成员变量而言,一旦有了初始值之后,就不能重新赋值,因此不可 以在普通方法中对成员变量重新赋值。成员变量只能在定义该成员变量时指定默认值,或者 在静态初始化块,初始化块,构造器中为成员变量指定初始值,如果既没有在定义成员变量 时指定初始值,也没有在初始化块,构造器中为成员变量指定初始值,那么这些成员变量的 值将一直是 0,\u0000,false null 这些成员变量也就失去了存在的意义。
{
public void test(final int a)
//在定义的方法中用 final 来修饰形参
{ //不能对 final 修饰的形参赋值,下面语句非法
//a = 5;
public static void main(String[] args) {
//定义 final 局部变量时指定默认值,则 str 变量无法重新赋值 final String str ="hello";
看代码: public class TestFinalMethod {
public final void test() {} }
class Sub extends TestFinalMethod {
//下面方法定义将出现编译错误,不能重写 final 方法 public void test() {} }
public static void main(String[] args) {
//下面定义了 4 个 final "宏变量" final int a = 5+2; final double b = 1.2/3; final String str = "世界"+"JAVA"; final String book = "世界 JAVA 您好"+99.0;
编译结果:
从编译结果中可以看出,程序中定义了一个 final 成员变量:age,系统不会对 age 成员变量 进行隐式初始化,所以初始化块中,就会报错。只要把定义 age 属性时的 final 修饰符去掉, 上面程序就会正确了。
final 修饰局部变量 系统不会对局部变量进行初始化,局部变量必须由程序员显式初始化。因此使用 final
//系统不会对 final 成员属性进行默认初始化,所以此处代码将引起错误 System.out.println(age); age = 6;
System.out.println(age); }
public static void main(String[] args) {
new Test(); } }
与普通成员变量不同的是,final 成员变量(包括实例属性和类属性)必须由程序员 显式初始化,系统不会对 final 成员进行隐匿初始化。所以,如果打算在构造器,初始化块 中对 final 成员变量进行初始化,则不要在初始化之前就访问成员变量的值。
错误代码:
public class Test {
final int age; {
定下来。
//下面的 book2 变量的值因为调用了方法,所以无法在编译时被确 final Stringbook2 = "世界 JAVA 您好"+String.valueOf(99.0);
相关文档
最新文档