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. Pycharm 的常用快捷键

    pycharm常用快捷键 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性) Ctrl + Alt + Space  快速导入任意类 Ctrl + Shift ...

  2. 在vultr中安装k8s测试

    vultr 安装k8s *** 如果国内访问 k8s.gcr.io 很慢,或者无法访问 *** 在应用yaml文件创建资源时,将文件中镜像地址进行内容替换即可: 将k8s.gcr.io替换为 regi ...

  3. [WEB安全]XXE漏洞总结

    目录 0x00 XML基础 0x01 XML文档结构 0x02 DTD 0x03 实体 0x04 XXE漏洞 0x05 总结一些payload 0x06 XXE漏洞修复与防御 0x07 参考链接 0x ...

  4. mysql的select语句

    参考: https://www.cnblogs.com/xiaoshen666/p/10824117.html https://www.cnblogs.com/zouwangblog/archive/ ...

  5. mysql使用慢查询日志分析数据执行情况

    #查询慢查询日志文件路径show variables like '%slow_query%';#开启慢查询日志 ; #设置慢查询阀值为0,将所有的语句都记入慢查询日志 ;#未使用索引的查询也被记录到慢 ...

  6. ngx.shared.DICT.set

    ngx.shared.DICT.set 原文: ngx.shared.DICT.set syntax: success, err, forcible = ngx.shared.DICT:set(key ...

  7. Cross-Site Request Forgery (CSRF)

    https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) Overview Cross-Site Request Forger ...

  8. Java 内存模型学习笔记

    1.Java类 public class Math { public static final Integer CONSTANT = 666; public int math(){ int a = 1 ...

  9. C++ private,public,protected 关键字

    第一: private,public,protected的访问范围:   private: 只能由该类中的函数.其友元函数访问,不能被任何其他访问,该类的对象也不能访问. protected: 可以被 ...

  10. linux操作利器alias用法

    写在前边 学习这件事,有时候并不一定很刻意,而是从生活,从经验中去积累,不知道什么时候就发生了. type 命令 一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法 ...