一、引用类型转换
多态的转型分为向上转型与向下转型两种:向上转型、向下转向。
1、向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。 当父类引用指向一个子类对象时,便是向上转型。向上转型是安全的,可以理解为一个小范围转到一个大范围,这种环境是可以适应的。
使用格式:
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
二、向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。
一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。 使用格式:
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
三、为什么要向下转型?
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子 类特有的方法,必须做向下转型。或者有时候系统给你一个方法,只能传递父类的对象,这种情况下你只能通过转型来进行参数的传递。
二、权限修饰符
在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限, public:公共的。 protected:受保护的。 default:默认的。 private:私有的。
其中:不同包的子类可以理解为在一个包下有一个a1类,在这个这个包下又创建了一个a11包,下面有一个a11类,通过这两个类去相互访问,相当于a11类的爸爸是a1类的兄弟。
上述四种权限也可以理解为:我自己->我邻居->我儿子->陌生人
三、匿名内部类
匿名内部类 :是内部类的简化写法。
它的本质是一个 带具体实现的父类或者父接口的匿名的 子类对象。 开发中,最常用到的内部类就是匿名内部类了。
以接口举例,当你使用一个接口时,似乎得做如下几步操作:
1)定义子类
2)重写接口中的方法
3)创建子类对象
4)调用重写后的方法
我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的捷方式。前提匿名内部类必须继承一个父类或者实现一个父接口。
什么时候用到匿名内部类?
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】。最后的{}算是一个没有名字的类。
格式:
new 父类名或者接口名(){
// 方法重写
@Override public void method() {
// 执行语句
}
};