匿名对象
- 概述:没有名字的对象
- 使用: new 类名().成员
- 注意:
- 如果使用匿名对象的话,需要在方法只调用一次的时候
- 如果使用的匿名对象为属性赋值,再用匿名对象去取值,是不可以的(因为会new很多次,会产生多个对象)
- 使用场景:一般用于单纯的调方法
继承
- 父类 超类 基类:
定义一个类,定义了这些个类的共性内容,将属于这个类的其他类的共性抽取出来 形成一个父类 - 子类 派生类:
其他属于此类的类都继承这个父类,那么久直接拥有了,这个父类中的共性内容,那么子类就没有必要去反复的写这个共性内容了 - 注意:
子类继承父类后,可以拥有父类中(非私有的内容)
构造方法不能被继承(因为构造方法的方法名是根据本类来的) - 使用场景:
如果我们定义了好几个类,类中都有共性的内容,我们就可以定义一个父类出来,吧这些类的共性抽取出来,减少了代码量 - 格式:
创建父类
创建子类
子类 extends 父类
子类就拥有了父类中的非私有成员
创建子类对象调用继承过来的父类 - 继承中成员变量的访问特点:
-
子类和父类中定义出来的变量不重名
当new父类对象时,只能调用自己的成员变量,不能调用子类的成员变量
当我们new子类的对象时,既能调用继承父类的也能调用自己特有的成员变量
如果是new的父类对象,只能调用自己父类的方法
如果是new的子类对象,那么既能调用父类继承过来的,还能调用自己特有的方法 -
重名
看等号左边是谁,优先调用谁的成员变量,如果子类中没有,找父类
看new的是谁,先走谁中的方法,子类没有找父类 -
总结:子债父偿
-
- 继承中三种变量(父类成员变量 子类成员变量 子类局部变量)重名的访问特点:
优先访问子类局部变量
super–>代表的是父类成员变量,可以区分子类和父类重名的成员
【扩展:如果没有明确继承某一个父类的话,这个类也是有父类的,这个类的父类就是Object类(所有类的父类)】 - 方法的重写(覆盖、覆写)
- 概述: 子类有&父类一模一样的方法
- 访问特点: 看new的是谁,先调用谁,子类没找到父类
- 注解: @Override–>可以检查此方法是否是重写方法
- 前提: 子父类继承关系
- 注意事项:
- 子类方法覆盖父类方法,必须要保证权限大于等于父类权限(public protected 默认(default) private)
- 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样
- 私有方法不能被重写(父类私有成员子类是不能继承的)
- 子类方法重写父类方法时,子类的方法返回值要是父类方法返回值的子类或者一样
- 构造方法中,第一行默认会有一个super(),super() 代表的是父类的空参构造,即使没有手写,默认也有
- 子类中如果写了有参构造,默认第一行会调用父类的有参构造,如果子类的有参构造中super(参数),去掉,就会找父类无参构造
【总结:方法的重写,就写成和父类一模一样的】
- 继承中super的使用
super–>代表的是父类对象
特点:可以调用父类的构造,普通方法,成员变量
访问父类的空参构造–>在子类的构造方法中第一行: super(参数)
访问父类的成员变量–>在子类的方法中:super.成员变量
访问父类的成员方法–>在子类的方法中:super.方法名(参数)
- this的使用:
作用:区分成员变量和局部变量重名问题
使用本类的成员变量–>在本类中:this.成员变量名
调用本类的方法–>在本类中:this.方法名(参数)
调用本类的构造方法–>在本类的构造方法中:this(参数)
注意:
- 使用this调用本类的其他构造方法时,也要在构造方法的第一行,但是this(参数),不会自动提供的,想使用自己写
- this和super在构造方法中不能同时出现
- 在本类中有参和空参不能相互调用
-
总结:
super多用在子类中,调用父类的成员
this多用在本类中,调用自己的成员 -
继承的特点:
- 继承不支持多继承
- 继承支持单继承,多层继承
- 一个父类可以拥有多个子类
抽象
- 抽象类定义:abstract class 类名
- 抽象方法定义:修饰符 abstract 返回值类型 方法名(参数);
- 使用:
- 定义子类,继承抽象类
- 重写父类中的抽象方法(要重写父类中所有的抽象方法)
- 创建子类对象,调用重写的方法(抽象方法不能new对象)
- 注意:
- 抽象方法所在类一定是抽象类
- 抽象类中不一定非得有抽象方法
- 抽象类中除了有抽象方法,还可以有其他普通类的成员
- 注意事项:
- 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象
- 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的
- 抽象类中,不一定包含抽象方法,但是有抽象方法必定是抽象类
- 抽象的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错,除非该子类也是抽象类