继承
概念
(1)继承体现的是一种"is-a"的关系
例如:A is a B 则成为 A继承B(子类 extends 父类)
语法
class A extends B{}
(2)继承是一种机制,继承的子类可以直接使用父类的属性和方法。
注:不是父类中的所有属性和方法都可以被子类使用(private不可被继承,父类的构造方法不能被继承)。
(3)继承本是一种"is-a"关系,所以不能强制使用继承。
优点:提高代码复用性,可扩展性
方法覆盖(override)
1.概念:子类中定义和父类一样的方法
2.要求:
(1) 子类中方法的方法名,返回值,形参列表要和父类一样
(2)子类中方法的修饰符要和父类一样或是更宽(public>protected>defualt>private)
3.使用:通过子类型引用调用方法,若子类对父类的方法实行覆盖,则优先使用子类覆盖的方法
4注意事项:
a.若子类中的方法的方法名,形参列表与父类一样,但返回值不同,则不是方法覆盖并且会编译报错
b.若子类中的方法的方法名,返回值与父类一样,但形参列表不同,则编译不会报错,运行也通过,但这不是方法覆盖而是方法重载。
面试题目
写出方法覆盖(override)与方法重载(overload)的区别?
方法覆盖:
a.方法的方法名,返回值,形参列表与父类一样。
b.子类的方法的修饰符与父类一样或比父类更宽
方法重载:
a.方法名与父类一样。
b.形参列表与父类不同(个数,顺序,数据类型)
c.方法的返回值,修饰符,异常没关系
4.父类:是将所有子类的共性抽取出,从而确定父类的属性和方法。父类中的信息通常为抽象的,子类的中的信息比较具体、特殊。
5.Java中类之间的继承属于单继承,一个子类只有一个直接父类,可以有多个间接的父类(多级继承),但一个父类可有多个子类。
例如 A extends B
C extends A
面试题目
Java中可以从父类中继承哪些内容(属性,成员方法,构造方法)
(1)父类中的构造方法不能被子类继承
a.构造方法的方法名必须和类名一致,子类和父类各自有不同的类名,所有父类的构造方法不能被子类继承。
b.子类具有更多的属性和方法,因此父类的构造方法不能满足子类的构造方法需求
(2)父类中的属性和方法能否被子类继承取决于父类属性和方法的修饰符。
a.Java中的访问修饰符
b.4个访问修饰符可以修饰哪些内容
|.4个访问修饰符都可以修饰类的属性/成员方法/构造方法
||.只有public 和 default 可以用于修饰类
c.4个访问修饰符修饰的属性和成员方法继承如下:
private :不能被继承
default:同包的子类可以继承
protected:(同包子类+非同包子类)可继承
public:可以继承
6.super的应用【开发应用重点】
(1)应用一: super.
a.super.可以应用在成员方法或构造方法中代表访问的是父类的属性或成员方法;
b.super.属性:访问父类的属性
c.super.成员方法()或super.成员方法(实参 ):代表访问父类的成员方法
(2)应用二:super()
a.super()/super(实参):应用在子类的构造方法中,代表指示JVM默认在创建父类对象中调用哪一个构造方法完成父类对象的创建
注意:super()/super(实参)定义在子类构造方法中的第一行有效
b.若在父类中没有定义构造方法,那么在父类对象创建时JVM会默认在父类中添加添加无参构造,但若父类中定义了有参数的构造方法而没有定义无参构造则JVM不会默认添加无参构造;
在子类创建对象中若子类的构造方法的第一行中没有写super()则JVM会添加默认super().
注意:JVM默认在子类的构造方法中的第一行添加的默认super()若父类中没有无参构造则会报错。因此类中要写无参构造,以避免这样的错误。
c.this()代表调用本类的无参构造方法,其有效位置在构造方法的第一行,因此this()和super()不能同时使用。如果一个构造方法的第一行为this()/this(实参),则JVM不会再提供默认super(),而是会根据this()/this(实参)找对应的构造方法,在一行查找super()/super(实参)
7.带有继承关系的创建对象过程【难点】
原理:创建子类对象时,JVM会先创建父类对象,但此父类对象仅供当前子类使用,外界无法访问。
过程:
(1)new:分配空间(子类+父类),同时为属性赋默认值
(2)执行子类的构造方法:若第一行遇到super()/super(实参),
|.先执行父类的构造方法
a.执行父类的属性初始化
b.父类构造中原有的其他语句
注意:父类的属性初始化也会编译器移交到父类的每个构造方法中
||继续执行子类构造方法:
a.执行子类属性的初始化
b.子类构造方法中原有内容
注意:子类的属性初始化语句,也被编译器移交到每一个子类构造方法中,但位于super()/super(实参)后面,构造方法其他语句的前面