- 包装类(Wrapper Class),为8种基本数据类型定义对应的引用类型,解决了基本数据类型的变量不能当成Object类型变量使用的问题。
- JDK1.5以后提供了自动装箱和自动拆箱的功能。1.5以前把基本数据类型变成包装类实例需要通过对应包装类的构造器来实现。
自动装箱:可以把一个基本数据类型变量直接赋值给Object变量。自动拆箱:可以直接把包装类对象直接赋值给一个对应的基本数据类型变量。
public static void main(String[] args) { Integer inObj = 5; //自动装箱 Object boolObj = true; //自动装箱 boolObj 是一个布尔型变量 Object stringObj = "true"; int it = inObj; //自动封箱 Integer对象赋值给int类型的变量 if (stringObj instanceof String) { // strObject对象为String类,String与Obeject存在继承关系 boolean b = (Boolean)boolObj; //自动封箱 强转后赋值 System.out.println(b); // 输出 true System.out.println(it); // it值为5 } }
- 把字符串类型的值转换为基本类型的值的两种方式。
- 利用包装类的的parseXXX(String s)静态方法(除了Charecter)
- 利用包装类提供的Xxx(String s)构造器。对应的基本数据类型必须用对应的封装类,否则会抛出异常(如果字符串为 “1.23” ,用Integer类.parseTnt(),抛出异常)。
String类提供了多个重载valueOf()方法,用于将基本类型数据转换为字符串。
public static void main(String[] args) { // 字符串转基本数据类型 String s = "123"; int it1 = Integer.parseInt(s); // 第一种方式 int it2 = new Integer(s); // 第二种方式,都输出结果 123 // 基本数据类型转字符串 float f = 3.4f; String fS = String.valueOf(f); // FS = "3.4" }
int类型自动装箱为Integer类时,-127到128之间的整数自动装箱为Integer实例,并放入cache数组中存放,可用于比较相等。不在此范围的数系统总是重新创建一个实例。
public static void main(String[] args) { Integer a = 2; Integer b = 2; a == b // 为true,在同一个数组中 Integer a1 = 128; Integer b1 = 128; a == b // 为false,两个实例,两个引用所以值不相等 }
- Java7为所有包装类提供了compare(value1, value2);方法,用于比较两个基本类型的大小,相等返回0,value1 < value2返回-1,value1 > value2返回1。String类没有,因为String不是包装类。
- toString();方法是Object类里一个实例方法(该方法总是返回该对象实现类的“类名 + @ + hashCode”),所有Java类都有该方法,重写该方法用于实现“自我描述”,也就是输出相关信息的功能。
“==”运算符判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不要求数据类型严格相同),只要两个变量的值相等就返回true。如果两个变量是引用类型,只有它们都指向同一个对象时才相等。
int it = 65; float f1 = 65.0f; System.out.println(it == f1); // true,类型不严格要求 char ch = 'A'; System.out.println(it == ch); // true,类型不严格要求 String str1 = "as"; String str2 = "as"; System.out.println(str1 == str2); // true,引用相同都为"as",常量池只有一个"as"副本 String str3 = new String("hello"); String str4 = new String("hello"); System.out.println(str3.equals(str4)); // true,值相同 System.out.println(str3 == str4); // false,引用不一样
- String str = “aa”; 与 String str = new String(“aa”); 的区别,第一种定义方式,JVM会用常量池来管理字符串。第二种JVM会先用常量池来保管“aa”,在创建一个新的String对象保存于堆内存。
常量池专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据。
String s1 = "abcd"; String s2 = "ab"; String s3 = "cd"; String s4 = "ab" + "cd"; // 编译时可以确定s5的字符串值为"abcd"。 String s5 = "a" + "b" + "cd"; // s1,s2,s3,s4,s5引用的字符串在编译时就确定了,引用常量池中的同一个字符串对象。 // 编译时无法确定s6的字符串值为多少,此时是通过s2连接s3确定。 String s6 = s2 + s3; String s7 = new String("abcd"); System.out.println(s1 == s4); // true System.out.println(s1 == s5); // true System.out.println(s1 == s6); // false, 猜测是因为不确定s6的引用字符串对象导致的, // 等弄明白了回来填坑 System.out.println(s1 == s7); // false, s7引用堆内存中的"abcd",与s1不同
- equals();方法是Object类提供的一个实例方法,也要求两个引用变量指向同一个对象才会返回true。所以可以按照需要重写,String已经重写。
- static修饰的成员为类成员,属于整个类,不属于单个实例。类成员不可以访问实例成员,因为有可能出现类成员已经初始化完成,但实例成员还没有初始化的情况。
- 单例类,这个类只能创建一个实例。构造器为private。简单单例类实现
- final关键字可用于修饰类、变量和方法,指定初始值后不可改变。final修饰的类变量必须在静态初始化块或声明定义时指定初始值。final修饰的实例变量必须在非静态初识化块、声明定义、或者构造器中指定初始值。
- 系统不会对局部变量进行初始化,用final修饰局部变量可指定也可不指定。final修饰的形参不能赋值。
- final修饰引用类型变量保存的是引用,保证这个引用变量所引用的地址不会改变,这个对象可以改变。
- final修饰的方法不可以重写,可以重载。fianl修饰的类不可以有子类。
- 不可变类创建该类实例后,其实例变量是不可改变的。如果程序经常要使用相同的不可变类实例,应该考虑缓存这个不可变类的实例,降低系统开销。
- 只有方法签名,没有方法实现的方法就是抽象方法,包含抽象方法的类只能是抽象类。
- 抽象类,抽象方法用abstract修饰,抽象类不能被实例化,只能用作父类被继承,其中包含五种成员:成员变量、方法(普通和抽象都可以)、构造器、初始化块、内部类。
- abstract修饰方法(不能用于构造方法),必须由子类重写具体实现,修饰类只能被继承。所以abstract与final不可同时使用(不是绝对的)。但是abstract修饰的方法不能为private,因为它需要被子类重写。
- 接口interface不能包含构造器和初始化块定义,其成员有:成员变量(只能是静态常量static final修饰),方法(只能是抽象实例方法,类方法或者默认方法),内部类。各成员都用public修饰。
- 接口主要用途:1. 定义变量,也可用于进行强制类型转换。2. 调用接口中定义的常量。3. 被其他类实现。
Java疯狂讲义读书笔记第六章(一)
最新推荐文章于 2024-09-17 11:50:15 发布