JAVA——不简单的fianl关键字
protected
用来修饰 域,代表域的访问权限是:包权限 或者 不同包,但是是子类 ;
final 修饰常量
只要是该常量代入的计算式,在编译时期,就会被执行计算,以减轻运行时的负担。(只对基本数据类型的计算式,奏效)
final 修饰引用
这个有个地方需要说下,只是引用指向的对象,一经确定,就不再可以修改为指向别的对象。但是对象本身的属性,可以随意改变;
空白 final
就是被申明为final,但是未赋值的域 ,称为 空白final ;但是在使用之前,必须对其进行赋值;
这样就可以灵活的为其进行赋值,但是又保持了其不可更改的特性 ;
final 参数
就是方法参数,被final修饰了;跟final引用一样,无法更改其指向其他对象 ;
final 方法
被修饰的方法,只能被继承,但是不能被覆盖 ;被修饰为final的方法,其实是用了前期绑定,因此,在之前这样做是可以提升效率的;
final 类
final类不可被继承,final类的方法,都被隐式的设定为final,但是域,不是final的,可以根据自己的意愿来设定 ;
子父类中同名的 private 方法
public class test {
public static void main(String[] args) {
A a = new B();
a.haha(); ; // error
a.hehe(); ; // ok
}
}
class A{
private void haha(){
System.out.println(“A”);
}
public void hehe(){
    System.out.println("A");
}
1
2
3
}
class B extends A{
private void haha(){
System.out.println(“B”);
}
}
它们之间是没有任何关系的;只是恰巧重名了 ;它们不能发生多态的行为;
方法的覆盖和向上转型,只针对方法是父类中能被子类继承的方法 ;因此,它们之间是没有向上转型、覆盖的说法的,也就没有多态的行为;
java中的前期绑定
我们都知道,java是采用后期绑定的;
但是,其实在java中有的地方,也采用可前期绑定;比如:static方法、final方法;这两种方法是前期绑定的;
由于private是隐式的final方法,因此,private方法也是前期绑定哦;
对了 构造器也是前期绑定,因为,其实,那个构造器是隐式的static方法 ;
免疫多态
域 和 静态方法 是不会产生多态行为的 ;
任何对 域 的操作,都是在 编译时期 完成的,此时编译器认为父类引用的就是父类的对象,因此,根本不存在多态的可行性;
静态方法,不存在多态的原因是:静态方法 是 前期绑定,此时编译器,也是单纯的认为,父类引用指向的就是父类对象,天真!
对于它们,是 编译看左边,运行看左边;
class A {
public int a = 1 ;
private void haha(){
    System.out.println("A");
}
public void hehe(){
    System.out.println("A");
}
public static void aa(){
    System.out.println("aa");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
}
class B extends A{
public int a = 2 ;
private void haha(){
System.out.println(“B”);
}
public static void aa(){
    System.out.println("bb");
}
1
2
3
4
}
public class test {
public static void main(String[] args) {
A a = new B();
System.out.println(a.a);
a.aa();
}
}
// output:1 aa ;都是输出父类的。
谁先被执行,构造器 还是 初始化?
从代码上看会有误解,先执行了构造器的第一句代码 ;其实,从虚拟机的层次讲,是先执行初始化的,后执行构造器;这涉及到类加载器对类进行加载的时候,会把类的信息,加载进方法区,虚拟机在查看类的类型信息的时候,如果发现有父类,则继续去加载父类的类文件,如果没有父类了,则开始初始化类,再然后执行构造器;然后一层一层的返回,这是从虚拟机层次看的;
但是,从代码层次看,给我们的感觉,则是先执行构造器,进行判断,看第一句代码是否有隐式的调用父类构造器,如果是,则跳转到父类构造器中,继续执行此逻辑 ;直到没有父类了,然后进行初始化,初始化完成以后,继续执行构造器中剩下的代码 ;
协变返回类型
在JDK1.5以后,在子类覆盖的方法,子类方法的返回值类型 可以是父类该方法返回值的子类 ;
JAVA——不简单的fianl关键字的更多相关文章
- “无法改变的设计”——浅谈Java中的final关键字
		
在Java中,final关键字可以用来修饰类.变量(包括成员变量和局部变量).方法,下面从这三个方面分别说明. final方法 当一个方法被final修饰时,表明这个方法不能被子类重写. 下面程序试图 ...
 - (转)Java中的static关键字解析
		
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...
 - 浅析Java中的final关键字(转载)
		
自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...
 - 关于Java中的transient关键字
		
Java中的transient关键字是在序列化时候用的,如果用transient修饰变量,那么该变量不会被序列化. 下面的例子中创建了一个Student类,有三个成员变量:id,name,age.ag ...
 - 关于Java中的final关键字
		
Java中的final关键字是用来限制用户行为的,说白了,就是用来限制我们这些程序员的.final可以用来修饰:变量.方法.类. 1)Java final variable final用来修饰变量时, ...
 - 关于Java中的static关键字
		
Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...
 - Java中的static关键字解析
		
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
 - 深入理解Java中的final关键字
		
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
 - 浅析Java中的final关键字
		
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
 
随机推荐
- 5.2【Linux 内核网络协议栈源码剖析】socket 函数剖析 ☆☆☆
			
深度剖析网络协议栈中的 socket 函数,可以说是把前面介绍的串联起来,将网络协议栈各层关联起来. 应用层 FTP SMTP HTTP ... 传输层 TCP UDP 网络层 IP ICMP ARP ...
 - HDU - 4513 吉哥系列故事――完美队形II(manacher)
			
1.找出一个最长的回文子串,要求中间的值最大,然后向两侧递减. 2.判断条件改为:Ma[i+Mp[i]]==Ma[i-Mp[i]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i ...
 - try-with-resources使用示例
			
try (InputStream is = new FileInputStream("test")) { is.read(); ... } catch(Exception e) { ...
 - redhat修复hostname主机名
			
1.修改文件vi /etc/sysconfig/network下的hostname,如: NETWORKING=yes HOSTNAME=master 2.修改文件:vi /etc/hosts 127 ...
 - Masonry复杂ScrollView布局
			
前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...
 - 数据库sqlite3的使用-代码实例应用
			
一.使用代码的方式批量添加(导入)数据到数据库中 1.执行SQL语句在数据库中添加一条信息 插入一条数据的sql语句: 点击run执行语句之后,刷新数据 2.在ios项目中使用代码批量添加多行数据 ...
 - java笔记之IO2写操作
			
IO流的分类 流向: 输入流 读出数据 输出流 写出数据 数据类型 字节流 字节输入流 读取数据 inputstream 字节输出流 写出数据 outputstream 字符流 字符输入流 读取数据 ...
 - HDU1180:诡异的楼梯
			
传送门 题意 迷宫搜索 分析 这题写起来挺简单的,锻炼搜索基本功,一开始用记忆化搜索TLE了,改用访问标记,0ms过了,用优先队列保证终点最快达到,我会在代码中提供一些强力数据 trick 1.遇到梯 ...
 - bzoj 4195: [Noi2015]程序自动分析【并查集】
			
等于有传递性,所以hash一下把等于用并查集连起来,然后再判断不等于是否合法即可 #include<iostream> #include<cstdio> #include< ...
 - 洛谷 P4009 汽车加油行驶问题 【最小费用最大流】
			
分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的 ...