强制类型转换
多态情况下不能访问子类特有的成员,如果需要访问子类特有的成员,那么就需要类型强制转换
基本数据类型转换:
小数据类型------->大数据类型 自动类型转化
大数据类型------->小数据类型 强制类型转换
引用数据类型转换:
小数据类型------->大数据类型 自动类型转换
大数据类型------->小数据类型 强制类型转换
类型转换最常见的异常:classcastexception强制类型转换失败
接口关系下的多态
实现下的多态: 接口 变量 = 接口实现类对象
接口下的多态,永远都是调用实现类的方法。
内部类
内部类的定义:一个类定义在另外一个类的内部,那么该类就称作为内部类
内部类的class文件名:外部类$内部类 好处:便于区分该class文件属于那个外部类的
内部类的类别:
成员内部类:
成员内部类的访问方式:
方式一:在外部类提供一个方法创建内部类的对象进行访问
方式二:在其他类直接创建内部类的对象
外部类.内部类 变量名 = new 外部类().new内部类();
A.B ab = new A().new B();
如果内部类被修饰成静态的那么创建方式将改成:
外部类.内部类 变量名 = new 外部类.内部类();
A.B ab = new A.B();
局部内部类:
局部内部类是在一个类的方法内部定义的另外一个类,那么另外一个类就称作为局部内部类
内部类的好处:内部类的好处就是可以直接访问外部类的所有成员
内部类的应用场景:我们在描述A事物的时候,发现描述的A事物内部还存在另外一个比较复杂事物B的时候,而且这个比较复杂事物B还需要访问A事物的属性等数据,那么这个时候我们就可以使用内部类描述B事物
成员内部类要注意的一些细节:
1. 如果外部类与内部类存在同名的成员变量时,在内部类中默认情况下是访问内部类的成员变量
2. 如果外部类与内部类存在同名的成员变量时,可以通过
外部类.this.成员变量名
指定访问外部类成员
3. 私有的成员内部类只能在外部类提供一个方法创建内部类的对象进行访问,不能在其他类创建
4. 成员内部类一旦出现了静态的成员,那么该类也必须使用static修饰
原因:静态的成员数据,是不需要对象存在的。
局部内部类要注意的一些细节:
1. 如果局部内部类访问一个局部变量,那么该局部变量必须用final修饰
如果一个局部内部类访问一个局部变量的时候,那么就让该局部内部类访问这个局部变量的复制品。是使用过程可能有人修改,但是必须保证复制品的值唯一,所以必须要加final。
匿名内部类
匿名内部类:没有类名的类就称作为匿名内部类
匿名内部类:简化书写
匿名内部类使用前提:必须存在继承或者实现关系才能使用
匿名内部类:匿名内部类只是没有类名,其他的一概成员都是具备的
匿名内部类使用方式:
New 父类名(){
实现抽象父类的方法
}.父类的方法名();
匿名内部类调用多次方法:
父类名 变量名 = new 父类名(){
实现抽象父类的方法
};
变量名.方法名1
变量名.方法名2
如果出现子类特有的方法,那就就只能用局部内部类去解决
实现关系下的匿名内部类:
Interface A{
Public void add();
}
Class b{
Public void print(){
New A(){
Public void add(){
System.out.println(“添加成功”);
}
}.add;
}
}
匿名内部类一般是用于实参