day_10:abstract、接口、多态、对象转型
abstract
当类存在一些无法确定具体实现的方法时,这个时候就需要把方法设置为抽象方法,而类也需要设置为抽象类而这些抽象方法的具体实现将交给子类来实现。
抽象类:用abstract修饰的类
抽象方法:用abstract修饰的方法,没有代码块
1.抽象类里可以没有抽象方法吗? 可以,但是没意义
2.抽象类可以创建对象吗? 不可以,创建的是一个匿名的子类(匿名内部类)
3.抽象类里面可以有普通方法吗? 可以
4.子类继承抽象类,必须重写父类的抽象方法吗?
不一定,如果子类是抽象类可以不重写;但是如果子类是非抽象类就必须重写
5.抽象类有没有构造方法? 有构造方法,只要是类都有构造方法
接口(interface)
当我们的类中只有常量和抽象方法时,那么这个类就有一个新的名字--接口,接口是一种特殊的抽象类,接口更多是代表一种扩展的功能或者标准
public interface IPerson { //默认添加public static final ==> public static final String str = "xxx"; String str = "xxx"; //默认添加public abstract ==> public abstract void eat(); public void eat(); public void play(); }
1.一个类可以实现多个接口吗? 可以
2.一个接口可以实现多个接口吗? 不可以,可以继承多个接口
3.接口里面的方法不一定是抽象的? 错,全是抽象方法
4.接口解决了类的单继承问题吗? 是的
5.一个类是否可以继承一个类并同时实现多个接口? 可以
6.一个类实现接口,必须实现接口里的抽象方法吗? 不一定,该类如果是抽象类既可以不重写
7.接口可以创建对象吗? 不可以,创建的是一个匿名内部类
//匿名内部类:创建了一个没有名字的类,实现了I3接口里的i3Method1方法,在创建该类的对象 I3 i3 = new I3() { @Override public void i3Method1() { } };
抽象类和接口的区别
1.语法层面:abstract、interface; extends、implements;
应用场景
重写:
父类:别人的类,我们不能随意更改
子类:继承父类,重写觉得不合适的方法
抽象类及抽象方法:
父类:我们编写,觉得有些方法不好准确实现的,就把方法设置成抽象的,交给子类实现
子类:重写父类的抽象方法(子类如果是抽象类可以不重写,如果子类是非抽象类,就必须重写)
接口:(更像是一个模板,规定了实现类必须要去实现的内容)
1.之前我们用的常量类,现在改为常量接口
2.如果抽象类只有抽象方法,直接用接口代替
为什么用接口代替?
类与类:单继承关系
类与接口:多实现关系
接口与接口:多继承关系
多态(多种形态)
1.子类对象指向父类引用
基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。
对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。
2.实现类对象指向接口的引用(接口类的多态)
多态的实现条件
1.继承:在多态关系中必须存在有继承关系的子类和父类
2.重写:子类对父类的某些方法进行重新定义,在调用这些方法的时候就会调用子类的方法
3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
缺点:因为是子类对象指向父类引用,所以子类特有的方法不能被调用。(对象的上转型)
优点:满足了OCP原则,创建类是欢迎的出bug几率小,但是不能更改代码,出bug几率高。在需求改变时会节省代码量。
接口
接口开闭原则:OCP
一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。
接口分离原则:ISP
把单个功能分为一个接口:功能可能要多个方法去实现
对象转型
向上转型:子类类型转父类类型
可以获取父类的属性和方法,不可以获取子类的属性和方法,但是可以获取子类重写父类后的方法
向下转型(不安全):父类类型转子类类型
ClassCaseException:类型转换异常
如何保证转型的安全,instanceof关键字来解决这个问题

浙公网安备 33010602011771号