美文网首页
Java学习-Day03-包装类

Java学习-Day03-包装类

作者: Indomi | 来源:发表于2018-03-25 16:54 被阅读0次

    学习顺序根据疯狂Java讲义(第三版)

    知识要点-面向对象(第六章)

    1.final关键字

    • 修饰变量,方法和类,系统不允许为final变量重新赋值(类似js中ES6的const),子类不允许覆盖父类的final方法,final类不能派生子类

    2.abstract和interface

    • abstract和interface分别用于定义抽象类和接口,抽象类和接口都是从多个子类中抽象出来的共同特征。但抽象类主要作为多个类的模板,接口定义了多类应该遵守的规范

    3.Java 8 增强的包装类(为了解决8种基本数据类型变量不能当成Object类型变量使用的问题)


    基本数据类型和包装类的对应关系

    JDK 1.5以前,把基本数据类型变量变成包装类实例需要通过对应包装类的构造器来实现。如果希望获得包装类对象中包装的基本类型变量,则可以使用包装类提供的 xxx Value()实例方法。

    • JDK 1.5中,Java提供了自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)功能,自动装箱可以把一个基本类型变量直接赋给对应的包装类变量,或者赋给Object变量;自动拆箱允许直接把包装类对象直接赋给一个对应的基本类型变量
    //直接把一个基本类型变量赋给了Integer对象
    Integer inObj = 5;
    //直接把一个boolean类型变量赋给了一个Object类型的变量
    Object boolObj = true;
    //直接把一个Integer对象赋给int类型的变量
    int it = inObj;
    
    • 注意:进行自动装箱和自动拆箱时必须注意类型匹配
    • 字符串转基本类型变量: parseXXX(String s)Xxx(String s)构造器
    • 基本类型变量转字符串:String.valueOf(123)或者一个更简单的方法String s = 123 + ""
    //举例
    String s = "123";
    int it1 = Integer.parseInt(s);
    int it2 = new Integer(s);
    //把一个float转换成String变量
    String ftStr = String.valueOf(2.345f);
    
    • 包装类型变量的类型是引用类型,但是仍然可以与数值类型进行比较,比较是直接去除包装类型所包装的数值进行比较的
    Integer a = new Integer(6);
    //输出true
    System.out.println(a > 5.0);
    
    • 两个包装类的实例进行比较,只有两个包装类引用了同一个对象时才会返回true
    //注意,返回false
    new Integer(2) == new Integer(2);//???结合下面的解释不是很理解
    
    • 特殊情况
    Integer ina = 2;
    Integer inb = 2;
    System.out,println("两个2自动装箱后是否相等"+(ina == inb));//输出true
    Integer biga = 128;
    Integer bigb = 128;
    System.out.println("两个128自动装箱后是否相等"+(biga == bigb));//输出false
    
    • 原因与Java的Integer类的设计有关,查看Java系统中java.lang.Integer类的源代码
    //定义一个长度为256的Integer数组
    static final integer[] cache = new Integer[-(-128) + 127 + 1];
    static{
      //执行初始化,创建-128到127的Integer实例,并放入cache数组中
      for(int i = 0; i < cache.length; i++){
        cache[i] = new Integer(i - 128);
      }
    }
    
    • 系统会把一个-128到127的整数自动装箱成Integer实例,并放入了一个名为cache的数组中缓存起来,如果以后把一个-128~127的整数自动装箱成一个Integer实例时,实际上是指向了对应的数组元素,即引用了数组的同一个元素,所以全部都相等;当把一个不在范围内的整数自动装箱成Integer实例时,系统总是重新创建一个实例,所以返回false

    4.Java 7 增强的包装类

    • Java 7 为所有的包装类提供了一个静态的compare(xxx val1, xxx val2)方法,可以用来比较两个基本类型值得大小,对于boolean值,有true>false`

    5.Java 8 对Integer,Long包装类增加的支持无符号运算的方法


    方法

    6.处理对象(所有Java对象都是Object类的实例)

    • toString():“自我描述”方法,输出对象的“自我描述”信息,告诉外界该对象具有的状态信息,可以重写,通常返回格式类名[field1=值1, field2=值2, ...]
    • ==和equals方法:==用来判断两个数值是否相等,如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就将返回true;equals()方法可以判断两个引用变量是否相等,该方法与==运算符没有区别,要求两个引用变量指向同一个对象才会返回true,但是可以重写equals()方法
    • String类已经重写equals()方法,String的equals()方法判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同,通过equals()比较将返回true

    7.String s = "abc"String s = new String("abc")的区别

    • 直接使用形如"abc"的字符串直接量,JVM将会使用常量池来管理这些字符串,常量池专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据,它包括了关于类,方法,接口中的常量,还包括字符串常量;可以直接引用常量池中的字符串
    • 使用new String("abc")时,JVM会先使用常量池来管理字符串直接量,再调用String类的构造器来创建一个新的String对象,新创建String对象被保存在堆内存中;使用new String()创建的字符串对象是运行是创建出来的,它被保存在运行时内存区,不会放入常量池中

    8.单例类

    • 一个类始终只能创建一个实例,这个类被称为单例类
    //实现一个单例类
    class Singleton{
      //使用一个类变量来缓存曾经创建的实例
      private static Singleton instance;
      //提供一个静态方法,用于返回Singleton实例
      //该方法可以加入自定义控制,保证只产生一个Singleton对象
      public static Singleton getInstance(){
        if(instance == null ){
          instance = new Singleton();
        }
        return instance;
      }
    }
    public class SingletonTest{
      public static void main(String[] args){
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);//返回true
      }
    }
    

    9.再次final修饰符

    • final修饰的成员变量必须由程序员显式地指定初始值
    • final修饰基本类型变量和引用类型变量区别:final修饰基本类型变量时,初始值确定了就不能改变,但是修饰引用类型变量时,只要引用类型变量所指向的地址不变就没问题,所以修饰引用类型变量所指向的对象可以进行修改
    • “宏变量”满足三个条件:1.使用final修饰;2.定义final变量时指定了初始值;3.该初始值在编译时就被确定下来 。当定义final变量时就为该变量指定了初始值,而且该初始值可以在编译时就确定下来,那么这个变量的本质就是一个“宏变量”,编译器会把程序中所有用到该变量的地方直接替换成该变量的值
    • final修饰的方法不可被重写,final修饰的类不可以有子类,例如java.lang.Math

    10.不可变类

    • 创建该类的实例后,该实例的实例变量时不可改变的
    • Java提供的8个包装类和java.lang.String类都是不可变类

    11.抽象类和抽象方法

    • 抽象方法和抽象类只能用abstract修饰符来定义,抽象方法不能有方法体
    • 抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例,即使抽象类里不包含抽象方法,这个抽象类也不能创建实例
    • 抽象类可以包含成员变量,方法,构造器,初始化块,内部类5种成分,抽象类的构造器不能用于创建实例,主要是用于被其子类调用
    • 含有抽象方法的类只能被定义成抽象类

    相关文章

      网友评论

          本文标题:Java学习-Day03-包装类

          本文链接:https://www.haomeiwen.com/subject/upzhcftx.html