JAVA-初步认识-第九章-面向对象-final关键字
一.
(看着上面的截图,final完全是对继承进行了限制)
final是最终的意思,本身也是一个修饰符,在往后学习的关键字当中大部分都是以修饰符的形式体现的。
一说到修饰符,一般都是能修饰成员,就想到public,private,static....
但是这个final修饰符,相当猛,可以修饰的东西多了去了。到底有什么用?我们可以来感受下。
之前讨论的都是继承的好处,(提高代码的复用性,让类与类之间产生关系,并为多态提供前提),现在讨论继承的弊端。
一个类当中往往定义一个功能,比如父类中有功能调用底层的资源,但是由于子类继承,覆盖。对底层造成了破坏。这样一来,继承就打破了封装性。继承有好处,也有弊端。final关键字就是缓解继承的弊端的。
继承带来了弊端,现在我们针对这个问题,来解决它。
有人说,不用继承就可以了,想继承我,不允许,强制一下,这个时候final关键字就用上了。(继承肯定是需要的,但是要对其进行限制)
看下面的截图,就目前的代码而言,编译是没有任何问题的,那么代码也就没有问题。
(上面截图中的程序,貌似没什么意义。)
现在不让你继承,final修饰类,
final修饰的类变成了最终类,我的理解就是变成了最后一个类,后面不存在可以继承它的子类,DOS结果也显示出错。想覆盖都覆盖不了。(这是修饰类的特点)
用final修饰的类,其中的功能都不能被复写。但是现在我们希望有的类被复写,有的不被复写。这样一来,我们可以将final加在方法上。
上面的截图,显示了final修饰的功能无法覆盖。如果用static也可以,也是出错,但是原理不一样(是说,明明是继承,但是父类静态的不提供,因此报错?)一个是无法调用,另一个是无法覆盖。
如果是private修饰,那么子类根本就不知道有method方法,也就不存在覆盖,(采用不同修饰符进行了试验,子类中的方法都无法使用父类中的形同方法,但是原理不一样。)
对第四句进行校验,修饰变量。(第四句举个例子来说明,比如说9这个数字,在程序中要经常使用。但是一直使用9,对其没有任何的解释,导致可读性不高,因此给其取个名字,这就是final修饰变量的由来。)
有final修饰的变量,无法对其进行二次操作,终身确定了。
有人说,直接写9这个常量就好了,干嘛还要定义终身不变的变量x,那不是麻烦么。定义变量的目的就是为了重复使用,并记录这个值。这是个常量,虽然被锁住了。
为什么要这么定义,这是有原因的。如果一直用常量9,9可以代表很多东西,年龄,次数,数字,我们并不清楚9背后的含义,为了提高可读性,就提出了final修饰常量。number是常量名,给很多常量起个名字。常量怎么保证不能变,final就行。这种应用开发中多了去了。
在JAVA中,变量名的书写和常量名的书写不一样。变量名的第一个单词首字母是小写,从第二个首字母开始大写。这个规则和函数名的书写一样(变量和函数冲突么,不冲突,函数后面接着小括号)。常量名是所有的字母大写,如果单词不唯一,单词之间用下划线连接。(对于不同位置的标识符的书写,有很严谨地区别。)
在程序中,甭管局部的,还是成员的,只要是固定不变的常量,为了提高阅读性,都用final修饰常量名。和常见存在的位置无关,只要是经常使用,为了提高可读性,都必须加上final。
分析上面的截图,final固定的是显示初始化值。不固化默认初始化值。
上面截图说的是,由于int x是固定的,用final固定的,那么对于所有对象而言都是不变的,一样的,那么就可以用static提取出来,共享。至于前面是否还要加上其他的修饰符,就看你的功能是什么了。如果是想本类中用,加上private就可以。如果是谁都能用,提供出去,那就用public修饰。
上面的MY_PI是全局常量,public是全,static是不需要变量,类直接调用。如果没有final的话,就是全局变量。加了final就是常量了。
看这里全局常量的书写格式,要明确各个修饰符的书写顺序。
来解释一下截图中各个修饰符的作用,public意味着可以提供给外界使用,static静态意味着只能本类使用(外界使用必须要间接使用),final就是固定,MY_PI也表明是全局常量。
补充:
子类继承父类的时候是继承了父类所有的属性和方法,其中包括私有的属性和方法,只不过是子类没有权利访问和重写么?
(应该不能这么说,如果继承私有化的事物的话,那么子类中也有了,怎么不能访问自己私有化的东西呢?说不通,只能是没有继承父类中私有化的东西)
java 特性,private:类中只要限定为private的成员,只能被这个类本身访问→这就意味着父类和子类还是两个类,只是两者之间存在某种关系,相似度比较高。
子类继承父类,你就认为是把父类的所有非private的属性和方法都复制到了子类中,如果属性和方法和子类有重复的,如果是方法重复,就是子类重写了父类的方法,如果是属性重复,那这个属性就是子类自身的属性。子类调用父类的方法或者属性使用super关键字。
注意,以上前提是父类所有的非private修饰的方法或者属性,是非private的。
除了 构造方法不能被继承,其它的 父类的所有都会被继承。只不过 private 的不能被访问,final 的不能被覆盖。→从构造函数看,对于继承的核心了解的还是不够深入。