相关标签:
Java
继承的概述
- 多个类中的共性内容向上抽取作为父类,从而让其各个子类共享
- 关键字:extends
继承的特点
- Java支持单继承,不支持多继承(一个子类只能有一个父类)
- Java支持多层继承(一个父类可以有多个子类)
继承中成员变量的特点
- 就近原则
- 有局部变量的先使用局部变量
- 无局部变量优先使用本类变量
- 无局部变量和本类变量再使用父类变量
- 就近原则的实质
- 在方法内部调用变量时,如果没有同名的局部变量会默认加上一个this关键字
- 如果该方法所在的类中没有同名的成员变量就去父类中查找
- 若父类中仍然不存在该变量,就会出错
- this、super关键字
继承中成员方法的特点
- 子类中没有这个方法,调用父类的
- 子类中重写了这个方法,调用子类的
- 方法的重写
- 在子父类当中,方法声明一模一样(方法名和参数列表都相同),子类的访问权限修饰符大于等于父类的访问权限修饰符,我们称之为方法的重写(覆盖)
- 方法的重载
- 方法名相同,参数列表不同,与返回值无关
- 方法的重写
方法重写的应用场景和注意事项
- 应用场景
- 当父类中的方法无法满足或无法完全满足子类的需求时,就需要对父类的方法进行重写
- 注意事项
- 子类重写父类的方法,访问权限必须大于等于父类的访问权限(权限修饰符)
- 子类重写父类的方法是,仍可以使用super关键字调用父类的方法
- 父类中的私有方法不能被重写(父类私有方法无法被继承)
继承中的构造方法和执行顺序
- 在有子父类继承关系的类中,创建子类的对象调用子类的构成方法
- 如果子类构造方法的第一行代码没有调用父类以及本类的构造方法,则会默认调用父类的无参构造
- 可以使用super()在子类的构造方法的第一行调用父类的构造方法
- 可以在子类的构造方法中使用this关键字调用本类的其他构造方法
- 构造子类的对象时必然会先执行父类的构造,因为要给父类的成员变量进行初始化
this和super的区别
- this
- 为当前对象的引用
- super
- 子类对象的父类引用
继承的优缺点
- 优点
- 提高了代码的复用性
- 提高了代码的可维护性
- 缺点
- 代码的耦合性变高
匿名对象的概述和应用场景
- 匿名对象
- 没有引用的对象称之为匿名对象
Student s = new Student(); //非匿名对象
new Student(); //匿名对象
- 应用场景
- 当方法只调用一次时可以使用匿名对象
- 匿名对象的优点
- 调用完就成为垃圾,等待回收,有利于节省内存
- 匿名对象的注意事项
- 匿名对象可以作为方法的参数进行传递,其本质是在方法进行调用时,将匿名对象赋值给了形式参数
- 匿名对象的参数可以进行赋值,但由于没有对其的引用,赋值完毕之后该对象就成为垃圾无法找到
- 每次使用匿名对象都会在堆内存中创建一个新的对象,所以如果需要多次调用该类的方法不建议使用匿名对象
final的概述和作用
- final修饰符
- 可以修饰类、方法、变量
- final修饰符修饰的类不能有子类
- final修饰符修饰的方法不能被重写
- final修饰符修饰的变量为常量
- 自定义常量必须初始化,可以选择显式初始化或构造初始化
final int NUM = 10; //显式初始化
public 类名(){
NUM = 10; //构造初始化
}
抽象类的概述
- 类是用于描述事物的,当我们没有具体的信息来描述该事物,那么这个事物就可以用Java中的抽象来进行表示
- 有抽象方法的类必须是抽象类
- 关键字abstract
抽象类的特点
- 抽象类中的方法可以使抽象方法也可以是非抽象方法
- 抽象类中可以没有抽象方法
- 抽象类不能实例化
- 必须被abstract关键字所修饰
- 抽象类与类之间关系是继承关系
- 一个类继承了抽象类要么重写所有的抽象方法要么他自己是抽象类
抽象类的成员特点
- 成员变量可以是变量和常量
- 可以有抽象方法和非抽象方法
- 有构造方法为了给成员初始化使用
抽象类的细节
- 不能共存的关键字
- final
- final关键字修饰的类无法被继承,而abstract修饰的类需要被继承
- final关键字修饰的方法无法被重写,而abstract修饰的方法必须要重写,否则没有方法体
- private
- private关键字修饰的类和方法无法被继承,而abstract修饰的类需要被继承,被其修饰的方法不被继承则无法重写
- static
- 被static修饰的方法可以通过类名直接调用,而被abstract修饰的方法没有方法体,无法被直接调用
- final
- 抽象类虽然不可实例化,但是其仍然有构造函数
- 抽象类可以无抽象方法,使其无法被创建对象
抽象的思想
- 将共性抽取,类似父类,区别在于抽取了只明确了一部分的方法,非抽象子类在继承抽象类时必须要进行抽象方法的重写