一、多态
概念: 同类型对象执行同一个行为,表现出不同行为特性。
常见形式:
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
多态中的成员访问特点
- 方法调用: 编译看父类,运行看右边。(多态强调行为)
- 变量调用: 编译看父类,运行看右边。(变量并没有冲突)
多态的要求
- 有继承或实现的关系
- 有父类引用指向子类对象
- 子类重写方法
作用:
- 在多态形势下,子类对象可以实现解耦合便于扩展和维护。(可以更换子类进行维护)
- 定义方法时可以使用父类型作为参数,该方法可以接受兄弟类对象,体现多态的扩展性与便利性。(模拟泛型传参)
缺点: 多态特性只能使用同类通用方法。
克服缺点方法: 强制类型转换。
类型转换的注意事项
- 当转型前的类型和对象真实类型不是同一种类型,会发出类型转换异常ClassCastException。(泰国男孩:???)
- 在转型前建议使用instanceof关键字判断类型,再进行强转。(先做个亲子鉴定,再转属性嗷)
instanceof使用方法:【变量名 instanceof 类型】(返回布尔值)
二、内部类
概念: 定义在一个类里面的类。
编写格式:
public class 外部类{public class 内部类{....}
}
使用场景与作用
- 一个事物内部有一个部分需要完整结构进行描述,而内部结构又只为外部事物提供服务时使用。(类似于人体与器官的关系)
- 内部类可以访问外部类的成员,包括私有成员。
- 内部类提供更好的封装性,内部类本身也可以用修饰符。
内部类分类
- 静态内部类
概念: 使用static修饰的内部类,属于外部类。
特点: 与普通类相同,只是位置在内部,可以访问外部类静态成员,但不可以直接访问实例成员(必须通过实例化外部类才能访问)。
格式:
public class 外部类{public static class 静态内部类{}
}
- 成员内部类(JDK16及以上可以定义静态成员)
概念: 无static修饰的内部类,属于外部类。
特点: 必须通过外部类才能创建内部类,可以访问外部类静态成员,也可以访问实例成员。(先加载外部类,再加载内部类)
格式:
public class 外部类{public class 成员内部类{}
}public class Main{public static void Main(String[] args){外部类名.内部类名 名字 = new 外部类构造器().new 内部类构造器();}
}
问:成员内部类如何访问到外部类的成员变量?
答:使用【外部类名.this.变量名】,【外部类名.this】可以访问内部类所在内部类的对象,因为外部类已经包含了内部类,this获取的是当前对象关键字,那么我们就可以通过外部类的当前对象获取。
- 局部内部类
概念:设置在方法、代码块、构造器等执行体中的类。
特点: 转以后的类文件名为外部类$N内部类.class
格式:
public class Test{public static void main(String[] args){class Temp{......}}
}
使用场景: 临时数据对象
- 匿名内部类
概念: 定义在方法、代码块中没有名字的局部内部类。
作用: 方便创建子类对象。
使用方式: 可以作为方法的实际参数进行传输。(new 出来就是个匿名对象)
格式:
new 类|抽象类名|接口名(){重写方法;
}
使用场景
public static void main(String[] args) {StudentExtend student = new StudentExtend();student.setContent("私有部分1");student.write();StudentExtend student2 = new StudentExtend(){@Overridepublic String writePrivate() {return super.writePrivate();}};student2.write();}