继承:

解决类的重用问题,在已有类的功能上继续进行扩充。

实现:

Class 子类(派生类) extends 父类(超类){}
子类能操作父类的属性和方法,但是本质上子类和父类是分开放的。创建子类对象的同时创建了父类的对象。如下图:
image.png
实例化子类之前系统一定会先自动实例化父类对象,相当于子类的构造方法隐含了
super()表示的就是子类调用父类构造方法的语句。该语句只允许放在子类构造方法的首行。如果父类中没有无参的构造方法,必须调用明确调用有参构造。

继承相关的限制:

1.java不允许多重继承,只允许多层继承。(只能继承一个,不能继承多个)对于继承而言,理论上不应该超过三层。
2.在继承关系的定义时,实际上子类可以继承父类中所有的操作结构,对私有操作是隐式继承,private类/方法不能直接访问,需要间接访问。

覆写:

当子类与父类方法名称,参数类型,个数完全相同的时候(跟父类一模一样),就称为方法的覆写。

意义:

优化父类的功能。

限制:

覆写的访问控制权限不能超过父类的访问控制权限。
父类方法如果是private,子类的覆写方法不会进行覆写操作而是相当于重新创建了一个方法。

final关键字:

定义不能被继承的类、定义不能被覆写的方法/常量。(常量一旦被定义则不可修改。)
常用于 public static final来定义全局常量。

  1. String a = "111";
  2. String b = "1" + "1" + "1";
  3. String tmp = "1";
  4. final String tmp2 = "1";
  5. String c = "1" + tmp + "1";
  6. String d = "1" + tmp2 + "1";
  7. System.out.println(a==b);//true
  8. System.out.println(a==c);//false -> tmp是变量
  9. System.out.println(a==d);//true

面试题:

解释override和overloading的区别:

区别: overloading override
中文含义: 重载 覆写
概念: 方法名称相同,参数类型及个数不同(对返回类型没有限制) 方法名称相同,参数类型、个数、返回类型相同
权限: 没有权限限制 被覆写的方法不能有更严格的控制权限
范围: 发生在一个类中 发生在继承关系类中

属性覆盖:父类与子类定义了相同名字的属性。本质上是子类定义了一个全新的属性,想要访问父类需要调用

面试题:

解释super与this的区别:
this先从本类查找方法/属性,如果本类不存在查找父类。super直接查找父类。
this与super都可以进行构造方法的调用,但是this()调用的是本类构造,super()调用的是父类构造。
this与super都必须放在首行,所以不能同时出现。
this可以表示当前对象。

多态:

在继承的基础之上扩展的概念,实现父子类之间的相互转换处理。
java中多态有两种实现模式:
1.方法的多态性
-> 方法的重载
-> 方法的覆写
2.对象的多态性:父子实例的转换处理。
-> 对象的向上转型: 父类 父类实例 = 子类实例。(自动完成转换)
-> 对象的向下转型:子类 子类实例 = (子类)父类实例。(强制完成转换)子类对父类的功能进行扩充时采用向下转型。

向上转型(接收和返回的统一性)
  1. class A{
  2. void print(){
  3. System.out.println("A");
  4. }
  5. }
  6. class B extends A{
  7. void print(){
  8. System.out.println("B");
  9. }
  10. }
  11. class C extends A{
  12. void print(){
  13. System.out.println("C");
  14. }
  15. }
  16. public class Main{
  17. public static void main(String args[]){
  18. //上转型,优势:对参数统一设计。
  19. func(new B());//B
  20. func(new C());//C
  21. }
  22. public static void func(A a){
  23. a.print();
  24. }
  25. }

向下转型:

在创立父类对象的基础上,将父类对象通过强制转换变成子类对象。

  1. class A{
  2. void print(){
  3. System.out.println("A");
  4. }
  5. }
  6. class B extends A{
  7. void differentPrint(){
  8. System.out.println("B");
  9. }
  10. }
  11. public class Main{
  12. public static void main(String args[]){
  13. A a = new B();//上转型
  14. a.print();
  15. B b = (B)a;//下转型
  16. b.differentPrint();
  17. }
  18. }

instanceof关键字

向下转型有报错的危险,所以转型前为了保证正确应该先判断,这个需要instanceof语法实现。

  1. class A{
  2. void print(){
  3. System.out.println("A");
  4. }
  5. }
  6. class B extends A{
  7. void differentPrint(){
  8. System.out.println("B");
  9. }
  10. }
  11. public class Main{
  12. public static void main(String args[]){
  13. A a = new A();
  14. System.out.println(a instanceof A);//true
  15. System.out.println(a instanceof B);//false
  16. A b = new B();
  17. System.out.println(b instanceof A);//true
  18. System.out.println(b instanceof B);//true
  19. }
  20. }