多态的应用——多态作为形参的情况
形式参数
基本类型 满足类型转换的原则
引用类型
普通类
当一个形参希望我们传入的是一个普通类时,我们实际上传入的是该类的对象 / 匿名对象
抽象类
当一个形参希望我们传入的是一个抽象类时,我们实际上传入的是该类的子类对象 / 子类匿名对象 / 匿名内部类
接口
当一个形参希望我们传入的是一个接口时,我们实际上传入的是该类的实现类对象 / 实现类匿名对象
注意:当一个方法的形参是引用类型的时候,建议养成一个好的习惯:做非空判断
多态的应用——多态作为返回值的情况
返回值类型
基本类型
引用类型
普通类
当一个方法的返回值是一个普通的类时,实际上返回的是该类的对象,我们可以使用该类的对象接受
抽象类
当一个方法的返回值是一个抽象类时,实际上返回的是该抽象类的子类对象,我们可以使用该抽象类接受
接口
当一个方法的返回值是一个接口时,实际上返回的是该接口的实现类对象,我们可以使用接口接收
当方法的返回值类型是引用类型的时候,可以使用链式调用
IStudent stu = new Istudent() {
@Override
public void study() {
System.out.println("外界的study")
}
}
内部类
什么情况下外部不能够创建类的对象?
抽象类
接口
构造方法全部私有
内部类
为什么需要学习内部类?
提高类的安全性
内部类的概念:
将类的定义的内部,那么该类就称为内部类
注意:内部类是一个相对的概念:
如果A中有一个B类,那么A类相对于B类来说就是外部类,那么B类相对于A类来说就是内部类
内部类的分类
局部内部类
成员内部类
静态内部类
匿名内部类
内部类的特点:
内部类可以直接访问外部类的私有成员吗? 可以
外部类可以访问内部类的成员?必须创建内部类的对象
如果编译器编译生成字节码文件,那么内部类会不会生成.class文件,如果会的话,格式是?
会生成,格式是:外部类类名$内部类类名.class
如果在外界要访问内部类对象可以,可以是可以,但是内部类有一个缺陷,会造成类和类的耦合性过高,慎用
成员内部类
格式:
外部类类名,内部类类名 对象 = new 外部类类名.new 内部类对象
一旦内部类成员加上private关键字,外界无法访问
当外部类类名和内部类类名成员重名的时候如何访问?
外部类类名.this.外部类成员
内部类如何访问外部类成员 - - 直接访问
外部类如何访问内部类成员 - - 不能直接访问,创建内部类的对象
外界如果访问内部类成员
外部类类名.内部类类名 对象 = new 外部类对象.new 内部类对象
外界如何访问内部类私有成员
无法访问,可以内部类提供对外的公共访问方式
当外部类类名和内部类类名成员重名的时候如何访问 - - 外部类类名.this.外部类成员
局部内部类
在局部的位置创建内部类对象,访问内部类成员
在JDK1.8之前,如果局部内部类访问外部类成员,需要加final关键字
静态内部类
格式:
外部类类名.内部类类名 对象 = new 外部类对象.内部类类名();
静态内部类中可以有静态成员和非静态成员
访问非静态成员需要创建对象
访问静态成员可以直接调用
外部类类名.内部类类名.静态成员
方便访问静态内部类的成员
匿名内部类
概念:本质就是一个子类匿名对象
特点:
是一个子类匿名对象
父类可以是普通类 抽象类 接口
是一个对象
没有名字的子类
前提条件: 存在一个父亲(接口 / 抽象类 / 普通类)
格式:
没有对象名
没有类名
当时它是一个子类
还是一个对象
new 类名 / 接口名(){
//重写方法
}