关于继承的问题解答
- 继承后的子类的构造器中,执行super()或者this()只能有一个,并且必须在第一行,如果显式地指明,子类的构造器中,会默认先执行父类的无参构造,然后再执行其他的操作。
- 方法的重写和重载的区别:
- 首先,重载的规则:必须具有不同的参数列表; 可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常
- 重写就不一样了,参数列表必须完全与被重写的方法相同,否则不能称其为重写;
- 返回类型必须一直与被重写的方法相同,否则不能称其为重写;
- 访问修饰符的限制一定要大于等于被重写方法的访问修饰符;
- 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,譬如父类方法声明了一个检查异常
IOException
,在重写这个方法时就不能抛出Exception
,只能抛出IOException
的子类异常,可以抛出非检查异常
类方法和实例方法的区别
类方法
用static修饰的方法。
由于类方法是属于整个类的,所以类方法的方法体中不能有与类的对象有关的内容。
即类方法体有如下限制:
- 类方法中不能引用对象变量;
- 类方法中不能调用类的对象方法;
- 在类方法中不能调使用super,this关键字;
- 类方法不能被覆盖。
实例方法
当一个类创建了一个对象后,这个对象就可以调用该类的方法(对象方法)。
- 实例方法中可以引用对象变量,也可以引用类变量;
- 实例方法中可以调用类方法;
- 对象方法中可以使用super,this关键字。
抽象类
- 抽象类不能够被直接实例化
- 继承抽象类的子类必须重写父类的抽象方法
- 抽象方法是没有方法体的
- 抽象类中可以有普通方法
- 抽象类中可以有构造方法
接口
接口分为 jdk1.7 和 jdk1.8
接口的特点:
- 所有的抽象方法都是 public + static 所修饰的,即使不写,默认就是这个组合。
- 接口中只能够有静态(static)常量(final),默认就是这个组合,不论你是否声明,都是使用 static final 来修饰。
- 接口中的所有抽象方法都必须在实现类中进行重写
- 接口中不能够直接new对象和抽象类,必须通过new子类的方式来进行实例化。
1.7和1.8之间的不同:
- 1.7中只能够有抽象方法 不能够有普通方法 也不能够有静态方法,换句话说只能有抽象方法。
- 1.8中可以有普通方法 可以使用default关键字进行修饰,也可以有静态方法
Tips:
java中是不支持多继承的。但是,可以通过接口的方式来实现多继承的效果
抽象类和接口的区别
区别的类型 | 抽象类 | 接口
:--: | :--: |
属性 | 可以有普通变量 | public static final 的变量(常量)
子类调用的方式 | 被继承 | 被实现
方法的声明和实现 | 既可以只声明抽象方法,也可以实现具体的方法 | 只能够进行方法的声明
组织结构 | 重构的结果 | 设计的结果
面向的功能角色 | 面向对象的 | 面向功能的
接口的好处
- 程序的耦合度降低
- 更自然地使用多态
- 设计与实现分离
- 更容易地搭建程序框架
- 更容易更换具体实现
接口回调
现有接口的使用者,再有接口的实现者。