抽象类、接口、内部类、多态
抽象类:abstract
如果一个类中,存在没有方法体的方法,这个方法就是抽象方法,如果一个类里存在抽象方法,那么这个类就是抽象类
抽象类也是类,可以放属性存储数据,有方法体就完成某个功能。
抽象类因为有抽象方法,所以程序员不能对抽象类实例化,但是jvm可以进行实例化。
抽象类只能做父类,当他的子类把所有的抽象方法补全,这个子类才能实例化对象,如果没有把所有抽象方法不全,那这个子类还是抽象类
注意:抽象方法不能使用static final private 修饰,抽象方法只存在于抽象类和接口中,不能存在于普通类中
接口:interface
抽象类抽象到极致,类中所有方法都没有方法体,这种情况建议组成接口
接口的特点
- 接口中的方法和属性都是公有的
- 接口是不能实例化对象的
- 必须有子类实现接口,且可以实现多个接口,接口间用 " , " 间隔,解决了java的单继承问题
- 子类实现接口用implements关键字
- 子类把接口中所有的方法都实现了,才可以实力化子类对象
- 接口中的属性默认是public static final ,不适合存储数据
- 接口中有方法,方法必须没有方法体,默认且必须是公有的
- 接口不能实现接口,但是可以继承,且支持多继承
- 接口中没有构造方法
为什么使用接口
- 用接口可以限定子类必须实现接口规定的方法,以保证项目功能的完整性
- 用接口可以实现多态,因为有了接口就一定有继承,而多态就是以继承为基础的
内部类
顾名思义就是把类放在某个范围的内部
- 类可以放在另一个类的内部 --> 类里套类
- 类也可以放在方法中 --> 方法里套类
类里套类
- 要使用内部类就需要在外部类中实例化内部类的对象,然后用对象打点调用内部类中的方法(可以在外部类中调用内部类的私有属性和私有方法),通过内部类里的方法来操作内部类中的数据
- 在内部类中可以直接使用外部类中的所有属性和方法
- 特殊用法:要使用内部类,可以在外部类的外面实例化内部类的对象,然后通过对象打点调用内部类的非私有的方法(在同一个包内)
OuterClass.InnerClass ic=oc.new InnerClass();
OuterClass.InnerClass ic1=new OuterClass().new InnerClass();
/*No enclosing instance of type OuterClass is accessible. Must qualify the allocation with
an enclosing instance of type OuterClass (e.g. x.new A() where x is an instance of OuterClass).*/
方法里套类
- 要使用方法中的内部类,就必须在方法中,内部类定义的下面,实例化内部类的对象,通过内部类对象打点调用内部类中的属性方法(包括私有)
- 内部类的作用域仅限于当前方法,从内部类定义开始到方法结束,内部类的作用域就消失了
- 在内部类中可以直接使用外部类中的属性和当前方法中的局部变量
- 在外部类的外部,不能使用方法中的内部类
- 在内部类用private修饰时,这个类不能是顶层类,只能在该类的外部类内部使用
匿名内部类
形式一:
//匿名内部类,但有对象名
Person p=new Person(){
public void study(){
//具体实现
}
public void eat(){
//具体实现
}
};
p.study(); //有对象名,可以打点多次调用方法
形式二:
//匿名内部类,但没有对象名
new Person(){
public void study(){
//具体实现
}
public void eat(){
//具体实现
}
}.study(); //只能调用一次方法,
匿名内部类的特点
- 当前匿名内部类中,只能实现一次,如果还想要其他的实现则必须使用匿名内部类重新new实现
- 匿名内部类更适合长辈的方法的实现,而且实现只需要实现一次即可
匿名内部类和有名内部类的区别
- 匿名内部类的方法只能实现一次,对象也只能有一个
- 有名内部类也是实现一次,但对象可以实例多个
多态
顾名思义就是多种表现状态
最直观的理解:有对象名称,用对象名称打点调用方法,在不同的时候执行的方法功能是不一样的
多态的判断标准
- 跨类且继承,多态是以继承为基础的
- 子类重写长辈的方法
- 子类对象赋值给长辈的引用
- 用长辈的引用打点调用方法
a. 用对象打点能调出哪些方法,取决于这个对象所对应的类或接口中有什么方法
b. 如果用长辈的引用打点调出的方法是重写过的方法,那么久执行重写后的方法
c. 如果长辈的引用打点调用的方法是没有重写的方法,则执行的是本长辈类中的方法
多态的应用场景
- 以长辈作为方法或函数的参数
- 以长辈作为方法或函数的返回值
多态的应用:
- 把所有的子类共有的方法抽象到一个接口中,只放方法
- 创建抽象类,实现接口,放置共用的属性或重写接口的方法,当然也可以添加新的方法
- 创建子类继承抽象类,按实际需求实现接口方法
- 直到所有的接口方法都给了对应的实现,才可以实例化对象