3.内部类
3.1成员内部类
3.1.1概念
定义在一个类的内部的类.内部类的地位与外部类的成员变量,成员方法平等,内部类也可以看做 是外部类的成员,成员之间可以相互调用
3.1.2使用
-
外部类的一个成员部分,创建内部类对象时,必须依赖外部类对象。
-
Outer outer = new Outer();
-
Inner inner = outer.new Inner();
-
Inner inner1 = new Outer().new Inner();
3.1.3特点
-
书写位置:与属性、方法平级别,且没有使用static修饰的类。
-
访问权限:内部类可以是任意的访问权限。
-
成员内部类中,不能写静态属性、静态方法。
-
编译之后生成的字节码文件格式:外部类$内部类.class
-
实例化对象,需要借助外部类的对象完成。
3.2静态内部类
3.2.1概念
在类的内部定义,与实例变量、实例方法同级别的,使用static修饰的类。
3.2.2使用
-
不依赖外部类对象,可以直接创建或通过类名访问。
-
Outer.Inner inner = new Outer.Inner();
3.2.3特点
-
书写位置:和类中的属性、方法平级,且使用关键字 static 修饰
-
静态内部类中,可以写属性、方法、构造方法...
-
静态内部类中,可以写静态属性、方法
-
编译之后生成的字节码文件,格式:外部类$内部类.class
-
对象的实例化,不需要借助外部类对象。
3.3局部内部类
3.3.1概念
定义在外部类的方法中,作用范围和创建对象范围仅限于当前方法。
3.3.2特点
-
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。
-
不能使用访问权限修饰符修饰。
-
书写位置:写在一个类的方法内部,作用域仅限于当前方法。
-
局部内部类,编译后生成的字节码文件格式:外部类$序号内部类名.class
3.3.3局部内部类的作用
通过局部内部类实现了功能的私有化,并对方法内部的代码进行了整理,增强了代码的可读性和可操作性
3.3.4局部内部类所在方法中局部变量的使用
-
final:被final修饰的变量会被放在常量区,而常量区的值存在的时间要大于局部变量所在的 方法,相当于从原来的基础上扩大了作用域
-
当方法中同时存在局部内部类与局部变量时,局部变量的使用范围就会从原来的基础上进 行扩大.
原因:在当前程序执行时,程序会默认让final去修饰height.所以当局部变量所在的方法结束的时 候,变量没有被释放,保存的值还在.
-
关于变量前面的final的说明
-
前提:变量必须与局部内部类同时存在.并且在局部内部类中使用了当前的局部变量
-
在jdk1.7之前要想保住局部变量的值,要手动添加final
-
在jdk1.7之后,程序执行时,java的内部机制已经在变量的前面默认添加了final
-
3.4匿名内部类
3.4.1概念
匿名内部类(对象):定义在一个类的方法中的匿名子类对象,属于局部内部类
其实这个概念我们可以分成两部分看
先学习匿名子类对象:没有名字的子类对象
再学习匿名内部类对象:一个类的方法中的匿名子类对象
3.4.2特点
-
一切特征与局部内部类相同。
-
必须继承一个父类或者实现一个接口。
-
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
3.4.3匿名内部类作用
-
当只用到当前子类的一个实例对象的时候,定义好马上使用,使用完立刻释放
-
当不好起名字的时候
-
可以更好的定义运行时的回调(知道即可)
3.4.4创建匿名子类对象
-
创建方式
第一种方式:使用已有的子类创建匿名子类对象
使用场景:已经创建好的子类可以多次使用,适用于相同的功能被多次调用
第二种方式:直接使用Animal创建匿名子类对象
构成: new + 父类的名字/接口的名字 + () + {写当前子类的成员} + ; 使用场景:只能使用一次,使用完会被当做垃圾回收,适用于每次都使用不同的功能
3.4.5创建匿名内部类
-
说明
代码中的Animal对象就是一个匿名内部类
我们可以用匿名内部类做方法的参数或返回值
匿名内部类的父类可以是父类也可以是父接口
-
注意:除了new Object类是匿名对象,其他所有类的匿名对象本质上都是匿名子类对象
3.5内部类的作用
-
间接实现了多继承
-
方便定义
-
只有外部类可以访问创建的内部类的属性和方法,包括私有方法
-
同一个包中其他的类不可见,有了很好的封装性
4.包装类
4.1基本数据类型与包装类型
4.2装箱拆箱
4.2.1手动装箱
概念:由基本数据类型, 完成向对应的包装类型进行转换。
作用:
为了更好的存储
【推荐使用】方式2: 可以通过包装类的静态方法 valueOf() 完成装箱。每一个包装类中,都有一个静态方法 valueOf ,这个方法的参数是包装类型对应的基本数据类型的参数。直 接将需要包装起来的基本数据类型的数据,写到这个方法的参数中, 即可完成对这个基本数据类型数据的装箱。
4.2.2手动拆箱
概念: 由包装类型, 完成向对应的基本数据类型进行转换。
作用:
为了方便进行运算
方式: 使用每一个包装类对象的 xxxValue 可以实现。 这里的 xxx 就是需要转型的基本数 据类型。 例如, 如果需要转型为int类型, 则直接调用 intValue 即可。
备注: 某些包装类对象, 除了可以拆箱成对应的基本数据类型的数据之外。还可以将包装起 来的数字转成其他的基本数据类型的数据。 例如,Integer,除了有 intValue 之外,还有 byteValue 等方法。 其实,就是将包装类中包装起来的int数据, 强转成byte类型返回结 果。在使用的时候,找自己需要的方法去转型即可。
4.2.3自动装箱拆箱
概念: 所谓的自动装箱和自动拆箱, 指的是在进行装箱和拆箱的时候, 不用再使用上面的方 法完成装箱和拆箱的操作。 在JDK1.5之后, 装箱和拆箱是可以自动完成的!只需要一个赋值 语句即可!
方式: 没有什么特殊语法, 直接去进行赋值即可。
// 自动装箱:由一个基本数据类型,到对应的包装类型的转换。只需要一个赋值语句即可完
成。
Integer i1 = 10;
// 自动拆箱:由一个包装类型,到对应的基本数据类型的转换。只需要一个赋值语句即可完
成。
int a = i1;
注意:既然已经有了自动的装箱和拆箱, 为什么还要掌握手动的装箱和拆箱。 因为, 在有 些情况下, 自动的装箱和拆箱是不能使用的。
示例: 如果在一个类的重载方法中, 有两个方法的参数类型, 一个是基本数据类型, 一个是 对应的包装类型。 此时, 将无法使用自动装箱和拆箱。 必须通过手动的装箱和拆箱完成对应 的方法的调用。
4.2.4享元原则
概念: 是程序设计的一个基本原则。 当我们需要在程序中频繁的用到一些元数据的时候, 此 时, 我们可以提前将这些元数据准备好, 当需要的时候, 直接拿过来使用即可。 使用完成 之后, 也不进行销毁, 以便下次继续使用。
包装类中的享元: 将常用到的基本数据类型对应的包装类对象,预先存储起来。当使用到这些基本数据类型对应的包装类对象的时候,可以直接拿过来使用,不用再实例化新的对象了。
4.3字符串与基本数据类型转换
4.3.1基本数据类型转型字符串类型
概念: 基本数据类型, 转成字符串, 希望得到的结果是这个数值转成字符串的样式。 其 实, 就是直接给这个数值添加上双引号。
【推荐使用】方式2: 使用字符串的静态方法 valueOf 完成。
String str = String.valueOf(10);
4.3.2字符串类型转型基本数据类型
概念: 字符串类型转基本数据类型, 其实就是解析出这个字符串中的内容,转型成对应的基 本数据类型的表示。
注意事项1: 基本数据类型转字符串肯定是没问题的, 但是由字符串类型转到基本数据类型 的时候, 可能会出现问题。字符串中的内容, 不一定能够转成希望转换的基本数据类型。 如 果转换失败, 会出现 NumberFormatException 异常。
注意事项2: 对于整数来说,字符串中如果出现了其他的非数字的字符, 都会导致转整数失 败, 即便是小数点, 也不可以转。 这里并没有转成浮点数字, 再转整数的过程。
方式1: 使用包装类的静态方法 valueOf 方法
Integer num = Integer.valueOf("123");
方式2: 使用包装类的静态方法 parseXXX 方法。 这里的XXX就是要转换的基本数据类型。
int number = Integer.parseInt("123");
备注: 以上两种方式,都可以完成字符串类型到基本数据类型之间的转换。 如果希望直接转 成基本数据类型, 推荐使用方式2; 如果希望转成包装类型, 推荐使用方式1。
关于字符类型的特殊说明:
字符串类型, 没有类似于上面的方式, 可以直接转成字符类型。 如果一个字符串, 要转成 字符, 需要使用字符串的一个实例方法 charAt() 方法。 使用这个方法, 获取字符串中的 指定下标位的字符。
4.3.3 实现进制间的转换
-
把十进制转成其它进制
-
Integer.toHexString() 转十六进制
-
Integer.toOctalString() 转八进制
-
Integer.toBinaryString() 转二进制
-
-
把其他进制转十进制
/第一个参数:数据-以字符串形式存储
//第二个参数:进制-转之前的进制
Integer.parseInt(数据,进制)
int i2 = Integer.parseInt("10100011",2);
System.out.println(i2);
5.常用类
5.1常用类Math
5.1.1 概念
是一个数学类, 这个类中封装了很多用来做数学计算的方法。 当我们需要使用到数学计算的 时候, 要能够想到这个类。 这个类中有很多封装好的数学公式, 而且, 都是静态方法,方便调用。
5.1.2 常用静态常量
5.1.3常用方法
5.2常用类Random
5.2.1 概念
是一个专门负责产生随机数的类。 在Java中, Random类在 java.util 包中。 在使用之前, 需要先导包。
其实, 随机数的产生, 是有一个固定的随机数算法的。 代入一个随机数种子, 能够生 成一个随机数列。 但是由于算法是固定的, 因此会有一个“BUG”: 如果随机数的种子相 同, 则生成的随机数列也完全相同。
5.2.2常用方法
5.3常用类BigInteger、BigDecimal
5.3.1. 概念
这两个类,都是用来表示数字的类。 BigInteger表示整型数字, BigDecimal表示浮点型数 字。 这两个类, 可以用来描述非常、非常、非常大的数字。 例如整数, long是最大的表示 范围, 但是即便是long型, 也有它表示不了的情况。 BigInteger就是可以表示任意大小的数 字。
BigInteger: 表示整型数字, 不限范围。
BigDecimal: 表示浮点型数字,不限范围, 不限小数点后面的位数。
5.3.2常用方法
5.4常用类Date
5.4.1概念
是一个用来描述时间、日期的类。 在 java.util 包中!!!
5.4.2注意点
-
比较Date和Data类
Date:日期类
Data:数据类,装的是二进制的数据
-
比较java.util.date和java.sql.date包
java.util.date 对应的是java的日期类型,包括年月日 时分秒
java.sql.date 对应的是数据库的日期类型 ,只包括 年月日
如果需要数据类型转换,从java.sql.date转成java.util.date是自动类型转换,反之是强制
类型转换
5.4.3常用方法
5.5常用类SimpleDateFormat
5.5.1概念
是一个用来格式化时间的类。 使用这个类, 一般有两种操作:
-
将一个 Date 对象, 转成指定格式的时间字符串。
-
将一个指定格式的时间字符串, 转成 Date 对象。
5.5.2常用时间格式
在时间格式中,有几个常见的时间占位符
5.5.3常用方法
parse 方法
会抛出一个编译时的异常。 在使用的时候, 目前, 直接使用一键修复(alt + Enter), 用
try-catch 包围即可。
将一个字符串, 按照指定的格式进行解析。 如果字符串中的时间格式, 和对象实例化
的时候给定的格式不同, 此时会出现异常。