final关键字、多态 (札记)
目录
《Thinking in java》读书扩展
作者:淮左白衣
写于 2018年4月16日17:54:35
protected
用来修饰 域
,代表域的访问权限是:包权限
或者 不同包,但是是子类
;
fianl
值得好好讲下,并不是简单的一个关键字
final 修饰常量
只要是该常量代入的
计算式
,在编译时期,就会被执行计算,以减轻运行时的负担。(只对基本数据类型的计算式,奏效)final 修饰引用
这个有个地方需要说下,只是引用指向的对象,一经确定,就不再可以修改为指向别的对象。但是对象本身的属性,可以随意改变;
空白 final
就是被申明为final,但是未赋值的域
,称为空白final
;但是在使用之前,必须对其进行赋值;
这样就可以灵活的为其进行赋值,但是又保持了其不可更改的特性 ;final 参数
就是方法参数,被final修饰了;跟final引用一样,无法更改其指向其他对象 ;
final 方法
被修饰的方法,只能被继承,但是不能被覆盖 ;被修饰为final的方法,其实是用了前期绑定,因此,在远古时期(
JDK1.2、1.3?时期
),这样做是可以提升效率的;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");
}
}
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");
}
}
class B extends A{
public int a = 2 ;
private void haha(){
System.out.println("B");
}
public static void aa(){
System.out.println("bb");
}
}
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
以后,在子类覆盖的方法,子类方法的返回值类型 可以是父类该方法返回值的子类 ;
final关键字、多态 (札记)的更多相关文章
- 重写 final关键字 多态调用子类特有的属性及行为(向上向下转型)
1.override 重写:在继承中,子类与父类方法名相同,参数列表相同,的方法叫重写,与返回值有关; 主要应用于系统升级. 2.final 关键字: 可修饰:1.类-->被修饰后该类不能被继 ...
- java学习(六)面向对象 final关键字 多态
1.被fnial修饰的方法不能被重写,常见的为修饰类,方法,变量 /* final可以修饰类,方法,变量 特点: final可以修饰类,该类不能被继承. final可以修饰方法,该方法不能被重写.(覆 ...
- LY.JAVA面向对象编程.final、多态、抽象类、接口
2018-07-08 13:47:26 final关键字 多态 从右向前念 多态的成员访问特点及转型的理解 多态的问题理解: class 孔子爹 { public int age = 40; p ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- 抽象类、final关键字、多态
1.1 抽象类 1.1.1 抽象类概念 C extends B,B extends A,在继承过程中,形成一个继承金字塔,位于金字塔底部的类越来越具体(强大),位于塔顶的越来越抽象(简单). 例如:人 ...
- (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态
1.访问控制(笔试题)1.1 常用的访问控制符 public - 公有的 protected - 保护的 啥也不写 - 默认的 private - 私有的 1.2 访问控制符的比较 访问控制符 访问权 ...
- 重写、super关键字、final关键字、多态、子类型转换、抽象的初步了解
重写 含义 在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写.方法重写又称方法覆盖. 重写与重载的 ...
- 多态,向上转型,向下转型,final关键字
多态 概述 多态封装性,继承性之后,面向对象的第三大特性. 定义 多态:是指同一种行为,具有多个不同的表现形式. 生活中,比如跑的动作,猫,狗,大象跑起来的动作都是不一样的,再比如飞的动作 ...
- java自学第3期——继承、多态、接口、抽象类、final关键字、权限修饰符、内部类
一.继承: 关键字extends /* 定义一个父类:人类 定义父类格式:public class 父类名称{ } 定义子类格式:public class 子类名称 extends 父类名称{ } * ...
- JAVA:类的三大特征,抽象类,接口,final关键字<3>
一.类的三大特征 1.封装性 (1).什么是封装 封装就是把抽象出的数据和对数据的操作封装在一起, 数据被保护在内部, 程序的其他部分只有通过被授权的操作(成员方法), 才能对数据进行操作. (2). ...
随机推荐
- yy
sudo rm -rf /var/cache/apt/archives/python-catkin-pkg-modules_0.4.12-1_all.deb sudo rm -rf /var/cach ...
- activemq jmx
增加: -Djava.rmi.server.hostname=<IP addr>
- c#添加资源
1.在项目目录下创建Resources文件夹,把需要用到的图片放到此文件夹里 2.在项目属性-资源里面添加这些图片 此时就可以在项目里看到资源文件夹及其下的图片了 3.在代码里这样使用这些图片: Im ...
- osg qt 三维模型加载
osg::ref_ptr<osg::Node> OSG_Qt_::operateMatrix() { osg::ref_ptr<osg::Group> group = new ...
- 37 Flutter仿京东商城项目 结算页面布局
加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录 CheckOut.dart import 'package:flutter/material.dart'; impo ...
- RVCT编译错误 Cannot obtain license for Compiler
找不到文件 找不到文件 Error: C9932E: Cannot obtain license for Compiler (feature compiler) with license versio ...
- QML异常:Cannot anchor to an item that isn't a parent or sibling
翻译: 无法定位到不是父项或同级项的项 QML的anchor必须定位父级对象或者同级对象,不能定位到其他如:同级对象的子对象
- Python使用设计模式中的责任链模式与迭代器模式的示例
Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...
- Spring Cloud(8):日志及分布式跟踪(Sleuth&Zipkin)
简介 在微服务架构中,项目中前端发起一个请求,后端可能跨几个服务调用才能完成这个请求.如果系统越来越庞大,服务之间的调用与被调用关系就会变得很复杂,那么这时候我们需要分析具体哪一个服务出问题了就会显得 ...
- 细说可空类型 nullable PropertyType
可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次 ...