java进阶路线,java进阶书籍推荐

  java进阶路线,java进阶书籍推荐

  说到最后一个关键词,很多人都很熟悉。当使用匿名内部类时,它们可能经常使用final关键字。另外,Java中的String类是final类,所以今天我们将学习关键字final的用法。

  1.final关键字的基本用法在Java中,final关键字可以用来修改类、方法和变量(包括成员变量和局部变量)。下面从这三个方面来看看final关键字的基本用法。

  1.1装饰类当用final装饰类时,表示该类不能被继承。也就是说,如果你永远不会让一个类被继承,你可以用final来修饰它。final类中的成员变量可以根据需要设置为final,但是需要注意的是,final类中的所有成员方法都被隐式指定为final方法。

  用final来装饰一个班级的时候,要慎重选择。除非这个类将来真的不会用于继承,或者出于安全原因,否则尽量不要把这个类设计成final。

  1.2修改方法以下段落摘自《Java编程思想》第四版第143页:

  “使用最后一种方法有两个原因:

  锁定该方法以防止任何继承的类修改其含义;第二个原因是效率。在Java实现的早期版本中,最终的方法将被内联调用。但是,如果方法太大,您可能看不到内联调用带来的任何性能改进。在最近的Java版本中,这些优化不需要使用final方法。因此,如果该方法被设置为final,只有当您希望显式禁止它在子类中被重写时。

  注意:该类的私有方法被隐式指定为最终方法。

  1.3修改变量修改变量是final中使用最多的地方,也是本文接下来要重点介绍的内容。首先,理解最终变量的基本语法:

  对于一个final变量,如果是基本数据类型的变量,其值一旦初始化就不能更改;如果是引用类型的变量,初始化后就不能指向另一个对象。

  例如:

  2.深入了解final关键字2.1类中final变量与普通变量的区别?用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要在使用前初始化赋值)必须在定义时或构造函数中初始化赋值,final变量一旦初始化赋值就不能再赋值。

  那么最终变量和普通变量有什么区别呢?请看下面的例子:

  公共类测试{

  公共静态void main(String[] args) {

  String a= hello2

  最终字符串b= hello

  String d= hello

  字符串c=b ^ 2;

  字符串e=D2;

  system . out . println((a==c));

  system . out . println((a==e));

  }

  }结果:

  真实的

  false这就是最终变量和普通变量的区别。当最终变量是基本数据类型和字符串类型时,如果在编译期间可以知道它的确切false,编译器将把它用作编译时常数。也就是说,在使用final变量的地方,相当于直接访问的常量,不需要在运行时确定。

  所以在上面的代码中,因为变量B是被final修改的,所以会被当作编译器常量来处理,所以变量B在使用的时候会被直接替换成它的值。然而,对变量D的访问需要在运行时通过链接来完成。

  但需要注意的是,只有在编译时可以确切知道最终变量值的情况下,编译器才会进行这样的优化。例如,以下代码将不会被优化:

  公共类测试{

  公共静态void main(String[] args) {

  String a= hello2

  最终字符串b=get hello();

  字符串c=b ^ 2;

  system . out . println((a==c));

  }

  公共静态字符串getHello() {

  回‘你好’;

  }

  }这段代码的输出是假的。

  2.2被final修改的引用变量所指向的对象的内容是可变的吗?如上所述,final修改的引用变量一旦初始化,就不能指向其他对象,那么引用变量所指向的对象的内容是可变的吗?请看下面的例子:

  公共类测试{

  公共静态void main(String[] args) {

  final my class my class=new my class();

  system . out . println(my class . I);

  }

  }

  MyClass类{

  public int I=0;

  }这段代码可以编译成功并有输出结果,输出结果为1。这说明引用变量被final修饰后,虽然不能再指向其他对象,但是它所指向的对象的内容是变量。

  2.3 final和static经常混淆static和final关键字。static作用于成员变量以指示只保存一个副本,而final用于确保变量不可变。请看下面的例子:

  公共类测试{

  公共静态void main(String[] args) {

  my class my class 1=new my class();

  my class my class 2=new my class();

  system . out . println(my class 1 . I);

  system . out . println(my class 1 . j);

  system . out . println(my class 2 . I);

  system . out . println(my class 2 . j);

  }

  }

  MyClass类{

  公共final double I=math . random();

  公共静态double j=math . random();

  }运行这段代码,你会发现每次打印出来的两个J值是一样的,但是I的值是不一样的。从这里可以知道final和static变量的区别。

  2.3为什么匿名内部类中使用的外部局部变量只能是final变量?

  版权归作者所有:博主曲乐优香原创作品,转载授权请联系作者,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: