Thinking in java 读书笔记(P84 ~ P104)

作者:淮左白衣

写于:2018年4月10日16:42:57

目录


this 为什么可以代表调用对象

我们都知道,在一个非静态方法的内部,this 代表当前调用方法的对象 ;

其中的原因在于:当我们调用一个对象的方法的时候,编译器自己做了一些幕后工作;会把调用方法的对象的引用,作为第一个参数传给方法 ;这样,在方法内部,就可以获取到对象的引用了,java里面使用了 this 代表编译器传进来的在个参数 ;这就是this在方法内部代表调用对象的原因 ;

在构造器中,同样可以使用this ;this(xxxx) ;


这个有点特殊:构造器实质是一个静态方法;(出自Thinking in java P96


数组

  • 在java中,在定义数组的时候,引用不允许指定数组大小的
int[3] chars = null ;   // error
  • 下面的定义数组的两种方式,在内存空间分配上是 等价 的 ;
        int[] a = new int[]{1,2,4} ;
int[] b = {1,2,4} ;
  • 数组的默认初始化

    关于数字的类型,会被默认初始化为 0

    字符会被默认为 \u0000 ,但是我们人眼看不到这个字符,是一个空白

    对象引用会被默认初始化为 null


数组中的 length

java的所有类型的数组中都有一个固定成员 length ,它记录着数组的长度,每次我们访问数组,数组都会进行一次下标是否越界的检测 ,而检测就是根据下标与 length 的比较;


定义数组的3种方式

//方式一
int[] a = new int[]{1,2,4} ;
//方式二
int[] b = {1,2,4} ;
//方式三
int[] c = new int[3];
c[0] = 0 ;
c[1] = 1 ;
c[2] = 2 ;

可变参数列表

用于 参数个数不确定 的情况下 ,可以把它想象成一个 数组,只是这个数组的长度不定;其实,在使用的时候,我们也是把可变参数列表当做数组使用的 ;

在使用可变参数列表,编译器帮我们做了一些事

  • 我们不再需要显示的写数组语法了,而是可以直接的传值进入,编译器会帮我们把值转换成数组的 ;
// 方法接受一个可变参数列表
public void test3(int... num){
''''''
} //调用方法,可以直接传值进去
test3(2,3,5);
//假如,你闲的没事,也可以自己显示的写数组语法
test3(new int[]{2,3,5});
  • 可以传0个参数进去,也就是说可以直接什么都不传
    public void test3(int... num){
''''''
} //可以什么都不传
test3();
  • 支持自动装箱
    public void test3(Integer... num){
''''''
} //支持直接装箱
test3(2,3,5);
// 支持夹杂在一起的装箱
test3(2,new Integer(3),5);

涉及可变参数列表的重载

请看下面的代码:

     public void test2(){
test3(1,'1');
test3('a','a'); // 编译失败
} public void test3(float i,Character... num){
.....
} public void test3(Character... num){
.....
}

上面的代码,在写的时候,IDE是不会报任何语法错误的,这个最为致命的 ;需要手动编译,才会报错;报错的原因是:编译器不知道该调用哪一个方法 ;

为什么编译器不知道该调用哪一个方法了呢?

你可能会认为,不应该啊,‘a’ 被自动装箱为 Character 类型,然后调用 public void test3(Character… num) 方法 ;没错啊!如果你产生这样的疑问,可以看下作者的这篇博客,关于基本类型的方法重载

看完你会发现,其实这里,由于剧本数据类型的重载, ‘a’ 也会被提升到 float 类型 ,因此,编译器有两个选择,它就不知道具体调用哪一个方法了,因此报错了;

如何避免这样的问题

为每一个使用可变参数列表,都指定一个非可变参数,或者在重载的时候,只允许一个重载方法使用可变参数列表 ;

    public void test2(){
test3(1,'1');
test3('a','a'); } public void test3(float i,Character... num){ }
public void test3(char c,Character... num){ }

数组、可变参数 、this关键字 (札记)的更多相关文章

  1. Python3 系列之 可变参数和关键字参数

    刚开始接触 python 的时候,对 python 中的 *wargs (可变参数) 和 **kwargs (关键字参数)的理解不是很透彻,看了一下 <Explore Python>一书, ...

  2. Python 必选参数,默认参数,可变参数,关键字参数和命名关键字参数

    Py的参数还真是多,用起来还是很方便的,这么多参数种类可见它在工程上的实用性还是非常广泛的. 挺有意思的,本文主要参照Liaoxuefeng的Python教程. #必选参数 def quadratic ...

  3. python函数的参数-可变参数,关键字参数

    # -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Persona ...

  4. python中可变参数和关键字参数总结

    #_*_coding='utf-8' #可变参数 def person(name,age,*args): #定义了可变参数args print('传入的名字为:',name) print('传入的年龄 ...

  5. Python基础(六)_全局变量声明、可变参数、关键字参数

    1. global声明全局变量 #声明name这个变量为全局变量,只是写在函数里面 #写代码时,尽量不要用全局变量,会一直占用内存.       ------->{'name':'abc','s ...

  6. Python中的*可变参数与**关键字参数

    1.定义了一个需要两个参数的函数 def print_str(first, second): print first print second if __name__ == "__main_ ...

  7. Python - 函数形参之必填参数、缺省参数、可变参数、关键字参数的详细使用

    Python函数形参 必传参数:平时最常用的,必传确定数量的参数 缺省参数:在调用函数时可以传也可以不传,如果不传将使用默认值 可变参数:可变长度参数 关键字参数:长度可变,但是需要以kv对形式传参 ...

  8. c#中可变参数params关键字学习

    引用 https://www.cnblogs.com/maowp/p/8134342.html 基础知识 1.概念 params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候 ...

  9. c#中可变参数(params关键字的使用)

    一.params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中 ...

  10. python function with variadic arguments or keywords(dict) 可变参数与关键字参数

    *args 表示任意个普通参数,调用的时候自动组装为一个tuple **kwags 表示任意个字典类型参数, 调用的时候自动组装成一个dict args和kwags是两个约定俗成的用法. 变长参数可以 ...

随机推荐

  1. Bacteria (Gym - 101911C)

    2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage Bacteria Gym - 101911C ...

  2. 实现一个hoverDelay延迟hover

    实现一个hoverDelay延迟hover author: @TiffanysBear 需求背景 经常在页面开发中,需要使用hover事件来触发相应的网络请求或页面DOM元素显示切换,需要考虑的问题就 ...

  3. 计算机基础——Java笔记一

            电子管-晶体管 摩尔定律 18个月变一次       贝尔实验室 C语言是基础.芯片领域软件领域 机器语言 ——汇编语言——高级语言 (面向过程,面向对象)   基本的逻辑怎么用代码实 ...

  4. vlookup实战_英语单词更新

    https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博主 ...

  5. leetcode 143. Reorder List 、86. Partition List

    143. Reorder List https://www.cnblogs.com/grandyang/p/4254860.html 先将list的前半段和后半段分开,然后后半段进行逆序,然后再连接 ...

  6. 怎么用群晖webdav实现外网映射网络驱动器

    前几天刚作好群晖nas局域网内的磁盘映射功能,今天老板又想实现在家里也能跟在公司一样的方便访问映射功能,因为使用网页操作实在太麻烦了.这可怎么办官方提供的 Assistant工具只能操作局域网的,又没 ...

  7. proj-6.1.1 编译

    Requiring C++11 Requiring C++11 - done Configuring PROJ: PROJ_VERSION = 6.1.1 PROJ_ABI_VERSION = 6_1 ...

  8. antd ——按钮

    <ButtonGroup> <Button type="primary" htmlType="submit" onClick={this.ha ...

  9. jsplumb实现流程图

    流程图使用工具汇总 jsPlumb,开源软件,推荐使用,参考学习链接: jsplumb学习笔记.基本概念.中文简易教程 jTopo myflow Go.js JointJS,属于商业软件 mxGrap ...

  10. C#登录SSH执行命令,下载文件

    前言 批量登录SSH执行命令 ,把应急响应中的日志文件下载回来. 代码实现 Renci.SshNet编译出DLL,引用. using System; using System.Collections. ...