final关键字、多态 (札记)

原创 2018年04月16日 17:56:27

目录


《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以后,在子类覆盖的方法,子类方法的返回值类型 可以是父类该方法返回值的子类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngyouth/article/details/79963037

LabVIEW学习札记

  • 2010年06月28日 11:02
  • 9.23MB
  • 下载

Masm汇编札记Masm汇编札记Masm汇编札记

  • 2011年06月20日 01:04
  • 347KB
  • 下载

java上课笔记

  • 2015年04月10日 13:42
  • 11KB
  • 下载

final关键字特点

final可以修饰类,该类不能被继承。 final可以修饰方法,该方法不能被重写。(覆盖,复写) final可以修饰变量,该变量不能被重新赋值。因为这个变量其实常量。面试题:final修饰局部变量...
  • Jmiew123
  • Jmiew123
  • 2017-03-10 15:55:29
  • 290

final关键字的用法总结

目录目录 final关键字的基本用法 1修饰类 2修饰方法 3修饰变量 二深入探讨final关键字 1类的final变量和普通变量的区别 2被final修饰的引用变量指向的对象内容是否可变 3fina...
  • td_pch
  • td_pch
  • 2016-11-25 23:12:46
  • 501

深入理解final关键字

在Java中,final关键字可以用来修饰数据、方法、参数、类,下面我们来了解final的关键字的用法。基本用法final 数据对于基本类型,final使数值恒定不变;而对用对象引用,final使引用...
  • IO_Field
  • IO_Field
  • 2016-10-16 15:12:27
  • 2482

final关键字的深入理解

原文链接:http://www.jianshu.com/p/09b758c4000d1.final方法在编译阶段绑定,称为静态绑定(static binding),编译时常量,永远不可改变。 2.运...
  • u013991521
  • u013991521
  • 2016-08-01 22:17:36
  • 775

最老程序员创业札记

  • 2013年11月14日 09:17
  • 984KB
  • 下载

生物信息学札记 第三版 pdf

  • 2010年02月26日 18:48
  • 6.07MB
  • 下载

Java - Java中的final关键字有哪些用法?

(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能赋值一次且赋值以后值不能被修改(常量)。...
  • chimomo
  • chimomo
  • 2017-10-26 11:46:21
  • 572
收藏助手
不良信息举报
您举报文章:final关键字、多态 (札记)
举报原因:
原因补充:

(最多只允许输入30个字)