目录


《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关键字、多态 (札记)的更多相关文章

  1. 重写 final关键字 多态调用子类特有的属性及行为(向上向下转型)

    1.override 重写:在继承中,子类与父类方法名相同,参数列表相同,的方法叫重写,与返回值有关;  主要应用于系统升级. 2.final 关键字: 可修饰:1.类-->被修饰后该类不能被继 ...

  2. java学习(六)面向对象 final关键字 多态

    1.被fnial修饰的方法不能被重写,常见的为修饰类,方法,变量 /* final可以修饰类,方法,变量 特点: final可以修饰类,该类不能被继承. final可以修饰方法,该方法不能被重写.(覆 ...

  3. LY.JAVA面向对象编程.final、多态、抽象类、接口

    2018-07-08    13:47:26 final关键字 多态 从右向前念 多态的成员访问特点及转型的理解 多态的问题理解: class 孔子爹 { public int age = 40; p ...

  4. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  5. 抽象类、final关键字、多态

    1.1 抽象类 1.1.1 抽象类概念 C extends B,B extends A,在继承过程中,形成一个继承金字塔,位于金字塔底部的类越来越具体(强大),位于塔顶的越来越抽象(简单). 例如:人 ...

  6. (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态

    1.访问控制(笔试题)1.1 常用的访问控制符 public - 公有的 protected - 保护的 啥也不写 - 默认的 private - 私有的 1.2 访问控制符的比较 访问控制符 访问权 ...

  7. 重写、super关键字、final关键字、多态、子类型转换、抽象的初步了解

    重写 含义 在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写.方法重写又称方法覆盖. 重写与重载的 ...

  8. 多态,向上转型,向下转型,final关键字

    多态 概述   多态封装性,继承性之后,面向对象的第三大特性. 定义   多态:是指同一种行为,具有多个不同的表现形式.   生活中,比如跑的动作,猫,狗,大象跑起来的动作都是不一样的,再比如飞的动作 ...

  9. java自学第3期——继承、多态、接口、抽象类、final关键字、权限修饰符、内部类

    一.继承: 关键字extends /* 定义一个父类:人类 定义父类格式:public class 父类名称{ } 定义子类格式:public class 子类名称 extends 父类名称{ } * ...

  10. JAVA:类的三大特征,抽象类,接口,final关键字<3>

    一.类的三大特征 1.封装性 (1).什么是封装 封装就是把抽象出的数据和对数据的操作封装在一起, 数据被保护在内部, 程序的其他部分只有通过被授权的操作(成员方法), 才能对数据进行操作. (2). ...

随机推荐

  1. yy

    sudo rm -rf /var/cache/apt/archives/python-catkin-pkg-modules_0.4.12-1_all.deb sudo rm -rf /var/cach ...

  2. activemq jmx

    增加: -Djava.rmi.server.hostname=<IP addr>

  3. c#添加资源

    1.在项目目录下创建Resources文件夹,把需要用到的图片放到此文件夹里 2.在项目属性-资源里面添加这些图片 此时就可以在项目里看到资源文件夹及其下的图片了 3.在代码里这样使用这些图片: Im ...

  4. osg qt 三维模型加载

    osg::ref_ptr<osg::Node> OSG_Qt_::operateMatrix() { osg::ref_ptr<osg::Group> group = new ...

  5. 37 Flutter仿京东商城项目 结算页面布局

    加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录 CheckOut.dart import 'package:flutter/material.dart'; impo ...

  6. RVCT编译错误 Cannot obtain license for Compiler

    找不到文件 找不到文件 Error: C9932E: Cannot obtain license for Compiler (feature compiler) with license versio ...

  7. QML异常:Cannot anchor to an item that isn't a parent or sibling

    翻译: 无法定位到不是父项或同级项的项 QML的anchor必须定位父级对象或者同级对象,不能定位到其他如:同级对象的子对象

  8. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  9. Spring Cloud(8):日志及分布式跟踪(Sleuth&Zipkin)

    简介 在微服务架构中,项目中前端发起一个请求,后端可能跨几个服务调用才能完成这个请求.如果系统越来越庞大,服务之间的调用与被调用关系就会变得很复杂,那么这时候我们需要分析具体哪一个服务出问题了就会显得 ...

  10. 细说可空类型 nullable PropertyType

    可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次 ...