Day12-Java

值传递和引用传递

  • 值传递是值的拷贝, 引用传递是引用的拷贝
public static void main(String[] args) {
    String x = new String("goeasyway");
    change(x);
    System.out.println(x);
}

public static void change(String x) {
    x = "even";
}

作者:goeasyway
链接:http://www.jianshu.com/p/c0c5e0540928
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

String 类型是引用类型, new String 创建了数据在堆, 把这堆数据的首地址存在了栈
change(x) 方法传递参数时, 将首地址传进来
x = "even"; 对 String 改变, 但是无法被记录, 因为源码里 String 是 final 类型:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

而如果是 int a = 2 来进行 change, 也无法改变, 但是因为其他原因:基本类型在方法传递时是值传递, 结果不会影响到原来的值;
如果希望字符串可以改变, 那么使用StringBuilder就可以了, 因为引用类型是首地址传递, 结果会影响到原来的值.

字节Byte, 位bit

1字节(Byte) = 8位(bit)
bit是数据存储的最小单位,也叫做比特
文字: ASCII码中一个英文字母占一个字节, 一个中文占两个字节
标点: 英文标点占一个字节, 中文标点占两个字节
1KB = 1024B(Byte)
CPU的位指CPU一次能处理的最大位数, 比如32位计算机的CPU一次最多能处理32位数据

基本数据类型的取值范围

boolean 8bit
char 16bit
int 32bit
long 64bit
float 32bit
double 64bit

String

不是基本类型, 但是希望把它作为基本类型来用(基本类型传值, 对象传引用)
简单的说是希望让String能像基本类型一样传递值(不会因为引用指向了同一个内存地址而在传递的过程中改变值.)

  • 特点: String 的内容不会变.
  • 原因:
    //JDK源码中:
    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[]; //String 的本质是final的数组
      }
    
  1. 单靠 final 修饰 String 只是让 String 不可继承,
  2. 而数组 value 被final修饰, 也只是防止数组的引用地址被改, 如果使用
    final int[] value = {1,2,3,};
    value[2]=100; //数组被改成{1,2,100}
    
    或者
    final int[] value = {1,2,3,};
    Array.set(value, 2,100); //数组还是被改成{1,2,100}
    
  3. 所以还有个 private 让 value[] 只允许自己修改, 并在写 String 时不暴露出操作 value[]的方法.

静态内部类

静态内部类和非静态内部类
静态内部类是个独立的类, 比如A,B两个类, B有点特殊, 虽然独立存在, 只可以被A使用. 这时候, 如果把B并入A里, 复杂度提高, 搞得A违反了单一职责, 又可能被其他类(同一个包下的C)依赖, 不符合设计的本意, 所以不如将其变成A.B, 等于加个注释, 告诉其他类别使用B了, 它只跟A玩.
非静态内部类才是真正的内部类, 持有外部类的引用.
静态内部类英文名static nested classes(静态嵌套类)

Lambda

  1. gralde中替换编译器为jack
defualtConfig{
    useJack(true)
}
  1. 引用Java8
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

范例:

btnHandler.setOnClickListener(v -> {
    Log.i("a","a");
});

泛型 参考自Link

  • <? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”
  • <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”
  1. 为什么要用通配符和边界?
    使用泛型的过程中,经常出现一种很别扭的情况。我们有Fruit类,和它的派生类Apple类

    class Fruit {}
    class Apple extends Fruit {}
    

    然后有一个最简单的容器:Plate类。盘子里可以放一个泛型的“东西”。我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。

    class Plate<T>{
        private T item;
        public Plate(T t){item=t;
        public void set(T t){item=t;
        public T get(){return item;
    }
    

    现在定义一个盘子, 逻辑上"水果盘子"可以装水果, 也可以装苹果
    Plate<Fruit> p = new Plate<Apple>(new Apple());
    但实际上Java编译器不允许这个操作,
    error: incompatible types: Plate<Apple> cannotbe converted to Plate<Fruit>
    编译器的逻辑:
    苹果 IS-A 水果
    装苹果的盘子 NOT-IS-A 装水果的盘子
    所以就算容器里装的东西有继承关系, 但容器之间没有继承关系, 所以我们不可以把Plate<Apple>的引用传递给Plate<Fruit>
    而通配符就是用来让水果盘子和苹果盘子之间发生关系

  2. 上界通配符

    Plate<? extends Fruit>
    

    一个能放水果以及一切水果派生类的盘子.它和Plate<Apple>的区别就是
    Plate<? extends Fruit>Plate<Apple>Plate<Fruit>的基类
    直接好处是可以用苹果盘子给水果盘子赋值了
    Plate<? extends Fruit> = Plate<Apple>(new Apple());
    如果把Fruit和Apple的例子扩展一下,

    class Food{};
    
    class Fruit extends Food{}
    class Meat extends Food{}
    
    class Apple extends Fruit{}
    class Apple extends Fruit{}
    class Pork extends Meat{}
    class Beef extends Meat{}
    
    class RedApple extends Apple{}
    class GreenApple extends Apple{}  
    

    上界通配符的范围是


  3. 下界通配符

    Plate<? super Fruit>
    

    一个能放水果以及一切水果基类的盘子, Plate<? super Fruit>Plate<Fruit>的基类, 但不是 Plate<Apple> 的基类,

    下界通配符的范围是


  4. 副作用
    容器的部分功能会失效
    盘子容器具有get和set的方法

    class Plate<T>{
      private T item;
      public Plate(T t){item = t;}
      public void set(T t){item = t;}
      public T get(){return item;}
    }  
    
  • 4.1 上界<? extends T>不能往里存, 只能往外取
    set 方法会失效, 但 get 方法有效
    Plate<? extends Fruit> p = new Plate<Apple>(new Apple());
    //不能存入元素
    p.set(new Fruit()); //ERROR
    p.set(new Apple()); //ERROR
    
    //读取出来的东西只能存放在Fruit和它的基类
    Fruit fruit = p.get();
    Object object = p.get();
    Apple apple = p.get();//ERROR
    
    编译器在看到 Plate<Apple> 后, 盘子没有被标上"苹果", 而是标上一个占位符 CAP#1, 来表示捕获一个 Fruit 或 Fruit 的子类, 具体是什么类, 不知道, 所以以后想往里插入Apple 或者 Meat / Fruit, 编译器都不知道能不能和 CAP#1 匹配, 所以就都不允许.
    所以 通配符<?> 和 类型参数<T> 的区别在于, 对于编译器来说, 所有的T, 都代表同一种类型
    public <T> List<T> fill(T...t);
    
    这里T要么都是String, 要么都是Integer, 反正保持一致
    而Plate<?>表示, 盘子里放的是什么, 我不知道
  • 4.2 下界<? super T> 可以往里存, 但是取出来时只能放在 Object;
    Plate<? super Fruit> p = new Plate<Fruit>(new Fruit());
    
    //存入元素正常
    p.set(new Fruit());
    p.set(new Apple());
    
    //读取出来的东西只能存放在Object
    Apple apple = p.get(); //ERROR
    Fruit fruit = p.get(); //ERROR
    Object object = p.get();
    
  1. PESC原则
    Producer Extends Consumer Super
    1. 频繁往外读取内容, 适合用上界Extends
    2. 经常往里插入内容, 适合用下界Super

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 题目内容: class Fruit{int no;double weight;char key;public:vo...
    故事狗阅读 899评论 0 1
  • 泛型 对象和实例是一个意思,类与对象的关系就像数据类型和变量一样。 泛型的主要目的之一就是用来指定类(如:容器)要...
    yueyue_projects阅读 569评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • java笔记 Main.java文件中的入口类(即包含main方法)的访问权限不一定非要设定为public,不加p...
    御风逍遥阅读 601评论 1 1
  • 给我一支烟或者别的什么 给我彻夜未眠和长睡不醒的药 给我食物和清水 给我真实的感情和温暖的棉被 给我坚持不懈的勇气...
    爱酱lll阅读 296评论 19 15