2020/4/19java学习笔记
内部类与包装器
内部类和内部接口
非静态成员内部类:
非静态成员内部类作为外部类或外部接口的成员,不带有关键字static
性质:
- 在非静态成员内部类中,如果是访问自己定义的属性,可以直接访问,也可以通过this关键字来访问。
- 在非静态成员内部类中,可以访问外部类的所有成员,包括private修饰的。
- 在非静态成员内部类中,如果外部类和内部类的定义的属性同名,则可以通过外部类类名.this.外部类变量名的形式来访问.
实例化途径:
- 通过外部类的非静态方法实例化内部类, 在方法去实例化一个内部类对象
- 通过外部类的静态main方法实例化内部类,
Outer.inner in5 = new Outer().new Inner();
- 在内部类中通过this来表示内部类的实例。
局部内部类:
局部内部类也叫方法内部类,即在方法内部定义的内部类。
性质:
- 可以通过this访问自己的成员,访问外部类的成员属性,
Outer.inner in5 = new Outer().new Inner();
也可以直接访问参数 - 在局部类中,如果要访问外部类的局部变量,则此变量必须是final修饰的(提高局部变量的生命周期)。
- 内部类的对象中保存有外部类对象的引用,即Outer.this,也就是在内部类中有通过组合this关键字指向外部类对象的引用,因而在内部类不能定义静态的属性。
- 内部类的实例化必须先实例化外部类。
静态内部类:
用static修饰的内部类叫静态内部类,一个内部类用static修饰,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员或费静态成员,并且可以通过public,private,protected修饰。
- 静态内部类只能访问外部类的静态变量或方法,非静态的不能访问。可以访问静态内部类自己定义的非静态成员,因此默认情况下静态内部类的内部都是静态的。
- 生成一个静态内部类不需要外部类成员。静态内部类的对象可以直接生成:
Outer.Inner in = new Outer.Inner();
匿名内部类:
没有名字的内部类,类内部没有构造器。如果其是继承带有参数构造器的父类,则创建它点的时候必须带上参数,在实现过程中用super关键字调用相应内容。
匿名内部类不能定义任何静态成员、方法和类,并且不能用属性修饰,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐式实现一个接口或实现一个类。因匿名内部类为局部内部类,局部内部类的限制对其生效
对象包装器:
把基本类型转化为对象来处理。
-
包装器类的使用
专门用来包裹基本类型的类就交包装类,也叫包装器。主要目的是提供一个对象实例作为壳,将基本类型包到这个对象中,然后提供很多操作数据的方法。 -
字符串、包装类、原始数据类间的转换
-
String to Integer.
Integer integer = new Integer("158");
或者Integer integer = Integer.valueOf(str);
-
Integer to String.
Sring str = integer.toString(); -
Integer 转成 int.
int i = integer.intValue();
-
int to Integer.
Integer integer2 = new Integer(i);
或Integer integer2 = Integer.valueOf(i);
-
String to int.
int i2 = Integer.parseInt(str);
-
int to String.
String str3 = String.valueOf(i2);
或String str4 = i2 + ""
;
装箱和拆箱
自动装箱boxing , 拆箱unboxing
装箱:将基本数据类型包装为对应的包装类对象
Integer integer = 10;
拆箱:将包装类对象转换成对应的基本数据类型
Integer fooInteger = 10;
int fooPrimitive = fooInteger
JAVA编译器会根据源代码的语法来觉得是否进行装箱或拆箱。
Integer i = 10;//装箱
System.out.println(i + 10);//拆箱
注意点:
- 防止没有初始化就使用变量所引起的空指针异常问题
- 特殊情况:“==”也用于判断两个对象参考名称是否指向同一个对象,在自动装箱时对于一个-128到127之间的值,他们被装箱为Integer对象后,会在内存之中被重用。
2020/4/20--常用类介绍
知识要点
- String类
- 字符串高级匹配搜索
- 时间获取与计算
- Java语言国际化
String类
String类和StringBuffer两个类来封装对字符串的处理,在java.lang包中
使用双引号得到的其实是一个String类的对象,new String(String)构造方法对传入的参数创建了一个副本,形成了String对象,增加了性能开销
字符串常量
- 字符串双引号括起来
- 字符串的字符是Unicode国际统一编码,一个字符占两个字节
- String是一个final类,代表不可变的字符序列
- 字符串是immutabel的,不可变,内容被配置,它的内容就是固定的(改变字符串的值其实是改变了指向)
对于一些可以共享的字符串对象,会现在String池中查找是否存在相同的String内容, 如果存在则无需创建直接指向,“”创建一个字符串就会被存储在字符串常量池
intern()函数
判断常量池中是否存在该对象,存在则返回该对象,反之原对象会被加入池中,并返回引用。
字符串对象操作
-
length()方法
返回字符串的长度,汉字按一个字符计算
-
charAt(index)方法
返回下标为index的字符
-
equals、equalsIgnoreCase方法
equals(String s)方法用来比较当前字符串对象实体是否与参数字符串的实体相同,忽略大小写,就是字符串值的比较。
"=="在比较对象时,比较是否是引用同一个对象,在比较常量时是比较常量的值是否相等;
-
compareTo、compareToIgnoreCase
按字典顺序与参数s比较大小,相同返回0,当前大于参数返回是正值,小于参数返回负值
-
与indexOf相关的方法
常用的搜索方法:
- public int indexOf(String s)方法,表示从当前字符串开始检索首次s出现的位置,没有检索到则返回-1
- public int indexOf(String s, int startpoint)从startpoint位置开始检索字符串s,返回首次出现的位置,没有则返回-1
- public int lastIndexOf(String S)从头开始检索返回最后s出现的位置,没有则返回-1
- public int lastIndexOf(String s, int startpoint)从startpoint开始向前检索返回最后一个s出现的位置没有返回-1
-
startsWith、endWith方法检查是否以指定的开头或结尾
-
regionMatches方法
regionMatches(int firstStart, Stirng other, int otherStart, int length);
从当前字符串的firstStart开始截取长度为length长度的子串与从other字符串的otherStart位置开始截取长度为length的子串,最后将这两个进行比较,返回比较的真假值
字符串对象修改
给定字符串的修改操作都不会改变原有对象的值。
类型转换
-
转化为整形
public static int parseInt(String s);
-
转为float或double型
public static int parseFloat(String s);
-
数值转为字符串
public Stirng valueOf(int n);
public Stirng valueOf(byte n);
-
string到字符数组
public void getChars(int start , int end, char c[], int offset)
将当前字符串的一部分字符拷贝到参数c指定的数组中, 字符串的位置start 到 end -1,必须确保c能存下该复制的字符
StringBuffer类的使用
String对象的长度是固定,不能改变内容。
StringBuffer封装了一个字符数组允许变长和修改操作, java.lang.StringBuffer
StringBuffer类不像String类那样为了线程访问安全创建大量副本对象。因此,需要在字符串上进行的操作可以使用StringBuffer提高性能,没有特殊需求还是选择String类进行操作
StringBuilder类的使用
StringBuilder类是一个可变的字符序列。
日期类简介
- System类
- Date类
- Calendar类
-
java.lang.System类
public static long currentTimeMillis()返回当前时间与1970/1/1
0:0:0之间的以毫秒为单位的时间差(不太精确)。
UTC(Universao Coordinated Time): 世界协调时间、世界统一时间或世界标准时间
GMT(Greenwich Mean Time): 格林威治标准时间
UTC 比GMT更加精确, 差值不超过0.9
-
java.util.Date类
Date类表示特定的瞬间, 精确到毫秒。
- getTime():返回1970毫秒数
- toString: 把Date对象转化为String : dow mon dd hh:mm:ss zzz yyyy即星期 月 日 时:分:秒 时区 年