内部类:
概念:在类中定义的类,称为内部类
作用:补全外部类信息
经验:除匿名内部类外尽量保证不要使用内部类,因为会导致代码结构混乱,难以阅读
成员内部类:
定义位置:类中方法以外
public class Out{
public class In [extends 父类名implements 父接口1,父接口2,...] {
属性
构造函数
方法
代码块
}
}
注:成员内部类中不能定义静态成员(静态属性,静态方法,静态代码块)
创建内部类对象:
创建外部类对象,外部类对象.new内部类类名得到内部类对象
例:Out out = new Out; In in = out.new In(实参列表);
可以简化为 In in = new Out().new In(实参列表);用的是匿名对象
注: 当外部类属性名/方法名与内部类属性名/方法名一致且内部类想要用外部类的该属性/方法时,用外部类类名.this.外部类属性/方法,就可以调用与内部类重名的外部类属性或方法,不加的话调用的就是内部类的,this.属性名表示内部类属性this可以忽略不写
当局部变量和内部类属性重名时用In.this.内部类属性名调用内部类属性,此时内部类类名可以忽略不写(就近原则)
System.out.println(In.this.str01);或者System.out.println(this.str01);
内部类属性外部类用不了
外部类中创建内部类对象:
In in = new In();此时省略了this 完整为In in = this.new In();这个this指代的是外部类对象所以本质都是外部类对象.new内部类类名().
在外部类外创建外部类中的内部类的对象
外部类类名.内部类类名 对象名 = 外部类对象.new 内部类类名(实参列表);
因为静态方法中不能使用this关键字所以外部类的静态方法中不能直接创建内部类对象,需要先创建外部类对象,再用外部类对象.new内部类类名()创建内部类对象
静态内部类(静态成员内部类)
类中方法以外定义
public class Out{
public static class In[extends 父类名implements 父接口1,父接口2,...] {
}
}
不可定义:
无,所有东西都可以定义,抽象方法的话要把内部类也变成抽象类
创建静态内部类对象:
创建对象语法(只有这一种):
外部类类名.内部类类名 内部类对象名 = new 外部类类名.内部类类名(实参列表);Out. In in = new Out.In(实参列表);
静态成员内部类中不能直接使用外部类的非静态属性/方法,但是在静态成员内部类中定义的非静态属性,静态成员内部类中可以直接使用,类名.属性名调用.可以建立外部类对象然后点出外部类的非静态属性
静态成员内部类中可以使用外部类静态成员,当静态成员内部类与外部类静态属性名一致时需要使用外部类类名.属性名/方法名的方式调用外部类的属性或方法
静态成员内部类中的非静态方法中的局部变量与静态成员内部类中属性名重复用this.属性名表示静态成员内部类中的属性.
局部内部类
局部的东西都不可能有访问权限修饰符,所以局部内部类不能有访问权限修饰符但是可以用final和abstract修饰一般没人用,不可以用static修饰
定义在类中方法中
public class Out{
public void test01(){
class In[extends 父类名implements 父接口1,父接口2,...] {
}
}
}
不可以定义:
1 类名不能使用访问权限修饰符修饰,也不可以使用static修饰
2 局部内部类不能拥有静态属性,静态方法和静态代码块(静态的都不行)
创建对象:
局部内部类类名 对象名 = new 局部内部类类名(实参列表);
要在局部内部类下方创建.
注;
生命周期从定义类以后开始到局部内部类所在方法的结束而结束,简言之:在方法中定义的局部内部类的作用范围局部内部类下方到所在方法的尾部,出了局部内部类所在方法或者在局部内部类上方使用该局部内部类都是不行的
外部类属性与内部类属性名重复时用外部类类名.this.属性名为外部类属性,this.属性名是内部类属性
局部内部类所在方法中的局部变量与局部内部类中的属性重名时,或者与局部内部类中的方法中的局部变量重名时局部内部类中无法调用局部内部类所在方法的该局部变量.
局部内部类中的属性名与局部内部类中的方法的局部变量重名时可以使用this区分.所以命名时尽量不要重名.
Java1.8之后在 局部内部类中使用局部内部类所在方法中的局部变量时, 局部内部类中默认把该局部变量用final修饰. 局部内部类只能用自己所在方法的局部变量但不能修改
原因:设 局部内部类所在方法的局部变量为str,先调用局部内部类,局部内部类中用了str然后我修改了str再用局部内部类对象调用使用str的方法,这时候可能会乱调用.
匿名内部类(用的非常多)
匿名对象:
没有对象名的对象
定义位置:
实参或值使用
定义与创建对象语法:
new 父类名/父接口名(){
}
不能写构造函数,只能调用系统的无参构造
系统提供大量接口每次只用一次(只创建一次该类对象)不值得再创建一个类实现这个接口再创建子类对象转成父类对象所以就有了匿名内部类
定义位置:实参或者值中用
简介:没有类名的内部类
不可以定义:
静态属性,静态方法,静态代码块
无法定义构造函数(匿名内部类没有类名)
特点:只能在定义的时候创建一次对象
优点:节省类名
缺点:
可读性较差,代码结构不清晰
不用匿名内部类时创建接口对象
一个匿名内部类只能创建一个对象
使用匿名内部类创建接口对象时:创建了一个没有名字但是实现了A接口的对象
直接创建接口对象(子类转父类)时:
包装类
简介:描述基本数据类型的类称为包装类
概念:基本数据类型对应的引用数据类型(类)
基本数据类型(8种) 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
jdk1.5以后才有
自动装箱:将基本数据类型转换为其对应的引用数据类型的对象
Integer i = 10;i可以调用Integer中的方法
自动拆箱:将把引用数据类型的对象转换为其对应的基本数据类型的值或对象
Integer i = new Integer(12);
int i1 = i;这个过程就是自动拆箱
包装类把字符串转换成基本数据类型(character除外)包装类调用parseXXX(字符串)方法
int和double最常用,字符串转换成boolean类型除了传入"true"(不区分大小写)其余的都为false
要注意类型一致不能把"1.1"转为int
基本数据类型转换成字符串类型
整数缓冲区:
Java预设了256个整数类型的对象(-128~127)
int i1=128; int i2=128;此时i1==i2是true此处的==是判断值是否相等
但是Integer i3 = 128; Integer i4=128;此时i3==i4就是false;此处的==判断的是内存地址是否相同
Java预存-128~127当变量值在这中间直接指向预存的地方,超过这个范围就要new
这个是false因为使用了new即使是在整数缓冲区内也重新划分地址内存空间了.
System
简介:系统
拷贝数组:arraycopy(原数组,开始位置,新数组,开始位置,拷贝多长);
static void arraycopy(原数组,开始位置,新数组,开始位置,拷贝多长) 拷贝数组
直接用System点出来 System.arraycopy(原数组,开始位置,新数组,开始位置,拷贝多长)
获取当前系统时间:currentTimeMillis()
获取当前系统时间与1970年1月1日00:00:00:000的时间差,单位毫秒格林威治时间对应的北京时间1970年1月1日早8点
long time = System.currentTimeMillis();
建议JVM赶快启动垃圾回收器回收垃圾static void gc();
当栈中与堆中有明确指向时称为强引用,这时GC回收不了.让栈中的对象=null就会断掉这个链接GC才能回收,GC 只回收堆中的东西.
exit退出程序
参数为0 表示正常退出,非0表示异常退出
System.exit();
Arrays
作用: