内部类
成员内部类
类中类,类的五大成分之一(成员变量,方法,构造器,内部类,代码块)
public class Xxx{
public class Ccc{
}
}
四种形式:成员内部类、静态内部类、局部内部类、匿名内部类
成员内部类:类中的普通成员
无static修饰,属于外部类的对象持有
外部类名.内部类名 对象名=new 外部类名().new 内部类名();
成员内部类的实例方法中,可以直接访问外部类的静态成员,可以直接访问外部类的实例成员
静态内部类
有static修饰的内部类,属于外部类自己持有
public class Outer{
public static class Inner{
}
}
外部类名.内部类 对象名=new 外部类名.静态内部类();
静态内部类中,可以直接访问外部类的静态成员
静态内部类中,不可以直接访问外部类的实例成员(没有外部类对象 ,可以间接访问)
局部内部类
在方法中,代码块中,构造器等局部范围里的类
匿名内部类
匿名内部类本质是一个子类,同时会立即创建一个子类对象
匿名内部类的名称,当前类名&编号
new 类或接口(参数值...){
类体(一般是方法重写)
}
通常作为一个对象参数传输给方法使用,看实际开发需要,不会主动用
简化代码
接口不能有对象,
枚举
是一种特殊类
修饰符 enum 枚举类名{
名称1,名称2,...; (这些名称,本质是常量,每个常量都会记住枚举的一个对象)
其他成员...
}
构造器都是私有的,对外不能创建对象,
是最终类,不能被继承
从第二行开始,可以定义类的其各类成员
继承:java.lang.Enum类的,从enum类也会继承到一些方法
values方法是用来拿到枚举类的全部对象,放到一个数组中去返回
应用场景
用来表示一组信息,然后作为参数进行传输
常量做信息标准和分类,参数值不受约束
枚举做信息标准和分类,参数值受到约束,最好的信息标志和分类的理想方案
Math.floor(number);//向下取整 Math.ceil(number);//向上取整 Math.round(number);//四舍五入
泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量,称为泛型类、泛型接口、泛型方法,统称泛型
修饰符 class 类名<类型变量,类型变量,...>{
...
}
public class ArrayList<E>{
...
}
类型变量建议用大写字母,常用:E、T、K、V
提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力,这样可以避免强制类型转换,及其可能出现的异常
本质:把具体的数据类型作为参数传给类型变量
泛型接口
实现类在实现它的时候都可以申明要操作的类型
泛型方法、泛型通配符、上下限
public static <T> void test(T t){ }
通配符:是?,可以在使用泛型的时候代表一切类型,E\T\K\V是定义时使用
上限必须是*或者*的子类
下限必须是*或者*的父类
泛型的擦除问题和注意事项
泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了
泛型不能直接支持基本数据类型,只能支持对象类型(引用数据类型)
常用API:应用程序编程接口
Object类
Java中所有类的祖宗类
System.out.println(s1.toString);=System.out.println(s1);//toString可以不写,默认返回对象的地址形式,意义为了让子类重写,以便自己制定比较规则 equals意义:默认比较两个对象的地址是否相等。让此类重写,以便用于比较对象的内容是否相同。。
Objects
是一个工具类,提供了很多操作对象的静态方法给我们使用
包装类
把基本类型的数据包装成对象
自动装箱机制:基本类型的数据可以直接编程对象赋值给包装类。Integer it3=12;
自动拆箱机制:包装类的对象可以直接赋值给基本数据类型。int it4=it3;
功能一:包装类可以把基本类型的数据转换成字符串
int a1 = 12; String rs = Integer.toString(a1);
功能二:把字符串数据转换成基本数据类型
String ageStr="23"; int age = Integer.parseInt(ageStr);/int age = Integer.valueOf(ageStr); System.out.println(age+1);//24
泛型和集合都不支持基本数据类型,so包装类在集合和泛型中大量使用