静态类型检查:程序运行之前
动态;程序执行中
无检查



 Java verifies that types always match:
 String five = 5; // ERROR!
更正:java.lang,String

         String five=5;
静态类型检查:可在编译阶段发现错误,避 免了将错误带入到运行阶段,可提高程序正 确性/健壮性

Syntax errors 语法错误, like extra punctuation or spurious words. Even dynamically-typed languages like Python do this kind of static checking.  Wrong names 类名/函数名错误, like Math.sine(2) . (The right name is sin)  Wrong number of arguments 参数数目错误, like Math.sin(30, 20) .  Wrong argument types 参数类型错误, like Math.sin("30") .  Wrong return types 返回值类型错误, like return "30";  from a function that’s declared to return an int

非法的参数值,返回值,越界(在字符串使用负的或者较大的索引),空指针



静态检查趋向于类型,独立于变量的特定值的错误。静态类型保证变量从该集合中得到一定的值,但直到运行时我们才知道它究竟具有哪一个值。因此,如果错误只由某些值引起,如除零或索引超出范围,编译器不会对其产生静态错误。
相比之下,动态检查往往是由特定值引起的错误。

静态检查:关于“类型”的检查,不考虑值 动态检查:关于“值”的检查
赋值可以与变量声明相结合

 改变一个变量:将该变 量指向另一个值的存储空间 改变一个变量的值:将 该变量当前指向的值的存储空间中写入一个新的值。
不变数据类型:一旦被创建,其值不能改变 如果是引用类型,也可以是不 变的:一旦确定其指向的对象,不能再被改变

以下
作者:海子
         
本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利


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

  1.修饰类

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

2.修饰方法

  下面这段话摘自《Java编程思想》第四版第143页:

  “使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“

.修饰变量

  修饰变量是final用得最多的地方,也是本文接下来要重点阐述的内容。首先了解一下final变量的基本语法:

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

1.类的final变量和普通变量有什么区别?

  当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

5.关于final参数的问题

  关于网上流传的”当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法外的变量“这句话,我个人理解这样说是不恰当的。

  因为无论参数是基本数据类型的变量还是引用类型的变量,使用final声明都不会达到上面所说的效果。

  看这个例子就清楚了:

复习3.1

  上面这段代码好像让人觉得用final修饰之后,就不能在方法中更改变量i的值了。殊不知,方法changeValue和main方法中的变量i根本就不是一个变量,因为java参数传递采用的是值传递,对于基本类型的变量,相当于直接将变量进行了拷贝。所以即使没有final修饰的情况下,在方法内部改变了变量i的值也不会影响方法外的i。

  再看下面这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
    public static void main(String[] args)  {
        MyClass myClass = new MyClass();
        StringBuffer buffer = new StringBuffer("hello");
        myClass.changeValue(buffer);
        System.out.println(buffer.toString());
    }
}
 
class MyClass {
     
    void changeValue(final StringBuffer buffer) {
        buffer.append("world");
    }
}

  运行这段代码就会发现输出结果为 helloworld。很显然,用final进行修饰并没有阻止在changeValue中改变buffer指向的对象的内容。有人说假如把final去掉了,万一在changeValue中让buffer指向了其他对象怎么办。有这种想法的朋友可以自己动手写代码试一下这样的结果是什么,如果把final去掉了,然后在changeValue中让buffer指向了其他对象,也不会影响到main方法中的buffer,原因在于java采用的是值传递,对于引用变量,传递的是引用的值,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

  所以关于网上流传的final参数的说法,我个人不是很赞同。

参考资料:

  《Java编程思想》


相关文章:

  • 2021-06-15
  • 2022-12-23
  • 2021-04-08
  • 2022-12-23
  • 2021-09-06
  • 2021-07-05
  • 2021-10-09
  • 2022-12-23
猜你喜欢
  • 2021-07-03
  • 2021-12-16
  • 2021-10-02
  • 2021-06-14
  • 2022-01-22
  • 2021-06-16
  • 2021-11-29
相关资源
相似解决方案