Java高级--继承

1、为什么使用继承

  • 两个类之间有很多共同点,代码冗余较多,可以使用继承减少代码冗余

2、如何使用继承

  • 编写父类,父类中有子类所共有的属性和方法

  • 编写子类,子类继承父类的属性和方法,可以添加子类独有的属性和方法

    • 使用extends关键字建立继承关系

    • public class Student extends People {
      }
  • 注意:

    • 父类也可以称之为超类,子类可以叫做派生类

    • 一个子类只能有一个父类,一个父类可以有很多子类

    • 父类和子类是相对来说的,只有父与子之间才叫继承,爷爷和孙子没有继承

    • 符合is-a的关系的类可以使用继承优化

3、子类不能继承父类的构造方法

  • 子类不能继承父类的构造方法

  • 子类的构造方法中默认调用父类无参的构造方法

    • 如果给父类添加了带参构造方法后不添加无参构造方法,子类可能会报错,因为调用不到父类的构造方法了

  • 继承后初始化顺序

    • 父类属性--->父类构造方法--->子类属性--->子类构造方法

4、super关键字

  • 类似this关键字,但是this指向的是“这个对象”,super指向的是“父类”

  • 可以使用super关键字访问父类的属性和方法及构造方法

    • 主要用于区分该成员是父类提供的还是子类自己定义的(方法重写)

    • 如果成员变量和局部变量没有重名就不需要使用this

    • 如果子类没有重写父类方法,就不需要使用super关键字

  • super和this一样都要写在方法的第一句话

  • 子类的所有构造方法中,都默认添加了super();

5、子类不能继承的东西

  1. 构造方法

  2. 父类的私有成员(private修饰)

  3. 子类与父类不同包,父类中使用默认访问权限的成员

6、方法重写

  • 什么时候使用重写

    • 父类中的方法不能满足子类的需要,子类重写父类方法

  • 重写的要求

    • 必须具有相同的方法名

    • 必须有相同的参数列表

    • 必须有相同返回值类型

    • 子类中方法的访问权限不可以比父类更严格

  • 重写的优点

    • 可以保证代码的一致性,方便我们查找及维护

  • 不能被继承的部分不会被重写(构造方法、不可访问成员)

  • 子类对象在调用方法时,优先调用自身重写过的方法,而非父类的同名方法

7、抽象类

  • //某些类不应该被实例化,可以将其设置为抽象类,抽象类不能被实例化
    public abstract class Pet {
    }
  • 可以将父类定义为抽象类,目的是限制实例化。

    • 抽象类不能被实例化,即不能用new生成实例

  • abstract关键字可以修饰类、方法

    • abstract修饰的类是抽象类,抽象类不能被实例化

    • abstract修饰的方法是抽象方法,抽象方法没有方法体,在子类中必须被重写,除非子类也是抽象类

    • -——————————————标记 网络断开 笔记已记全

  • 抽象类中可以有普通类的成员(属性、普通方法、构造方法等)

    • 如果父类是抽象类,它的构造方法虽然无法通过new调用,但是可以在子类中使用super调用

  • 抽象方法只能放在抽象类中,不能放在普通类中【也就是说抽象类中可以有普通方法,抽象方法必须在抽象类里】

8、final关键字

  • final修饰的变量变常量

  • final修饰的类不可被继承(例如:String类)

    • public final class Pet {
      }
  • final修饰的方法不能被重写

    • public final void eat(){
          
      }

9、父类子类类型转换

  • 类是对象的类型

  • 基本数据类型存在类型转换

    • //基本数据类型的类型转换:1.数据类型互相兼容 2.大类型转小类型(强制)/小类型转大类型
      int a = 1;
      double b = 2.0;
      a = (int)b;
      b = a;
  • 引用数据类型也存在相似的转换,仍然需要满足”数据类型互相兼容“这一条件,比如父类和子类

    • 父类是大类型

    • 子类是小类型

    • Pet pet = new Pet();//范围大
      Dog dog = new Dog();//范围小
      pet = dog;
      dog = (Dog)pet;
    • //父类引用指向子类对象
      Pet pet = new Dog();//自动类型转换
      //pet.lookDoor();//虽然new的是一个Dog,但是装进了Pet中就只能Pet的方法,不能使用Dog独有的方法
      pet.eat();//调用是Dog的eat方法
  • 当父类引用指向子类对象时

    • 只能调用父类中定义的方法

    • 如果调用的方法被子类重写了,本质上是调用子类的方法

  • 如果要从父类转换成子类,必须保证父类中真正存储的是一个子类对象

    • Student stu = (Student) (new People);//错误
    • People people = new Student();//真正存的是student
      Student student = (Student) (people);//把people中真正存储的student转换成student
09-10 88
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值